当前位置: 技术问答>linux和unix
串口通讯问题,急。。。。。
来源: 互联网 发布时间:2015-04-06
本文导语: 现在急需用串口跟设备进行通讯。在网上找到一段初始化串口的程序,并自己加入了读取的部分。如下 nclude #include #include #include #include #include #include #include #include #include #include #include main() { int fd; s...
现在急需用串口跟设备进行通讯。在网上找到一段初始化串口的程序,并自己加入了读取的部分。如下
nclude
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
main()
{
int fd;
struct termios options;
fd=open("/dev/ttyS0",O_RDWR|O_NDELAY|O_NOCTTY);
if (fd!=-1)
fcntl(fd,F_SETFL,FASYNC);
bzero(&options,sizeof(options));
options.c_cflag=CS8|CLOCAL|CREAD;
options.c_iflag=IGNPAR;
options.c_oflag=0;
options.c_lflag=0;
options.c_cc[VTIME]=0;
options.c_cc[VMIN]=10;
cfsetispeed( &options ,B9600); /* set in speed */
cfsetospeed( &options ,B9600); /* set out speed */
tcsetattr(fd,TCSANOW,&options);
while (1)
{
printf("begin insert...n");
res = read(fd,buf,10);
if (res=10)
{
buf[res]=0; /* set end of string, so we can printf */
printf(":%s:%dn", buf, res);
}
else
{
printf("read erro...n");
}
}
tcsetattr(fd,TCSANOW,&oldtio);
};
编译运行后接收其他机器的串口发字符,接受不到。我不明白为什么,是否是初始化有问题。/dev/ttyS0是表示COM1吗,直接使用就行了吗,用不用在LINUX下还装什么驱动之类的东西。另外机器上有两个COM口。是否另外一个就用/dev/ttyS1呢?
我将VMIN值定为10,希望收到10个字符就返回。还想 还想问一下这条语句fcntl(fd,F_SETFL,FASYNC);是什么意思?必须要用的吗?
另外,我还了解到可以直接用OUTB或者INB对串口的地址操作。好象COM1的地址是2F8。有哪为大侠有这方面的资料,请给小弟看看,不胜感激啊。
今天问题比较多。请大侠门辛苦辛苦。谢谢
nclude
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
main()
{
int fd;
struct termios options;
fd=open("/dev/ttyS0",O_RDWR|O_NDELAY|O_NOCTTY);
if (fd!=-1)
fcntl(fd,F_SETFL,FASYNC);
bzero(&options,sizeof(options));
options.c_cflag=CS8|CLOCAL|CREAD;
options.c_iflag=IGNPAR;
options.c_oflag=0;
options.c_lflag=0;
options.c_cc[VTIME]=0;
options.c_cc[VMIN]=10;
cfsetispeed( &options ,B9600); /* set in speed */
cfsetospeed( &options ,B9600); /* set out speed */
tcsetattr(fd,TCSANOW,&options);
while (1)
{
printf("begin insert...n");
res = read(fd,buf,10);
if (res=10)
{
buf[res]=0; /* set end of string, so we can printf */
printf(":%s:%dn", buf, res);
}
else
{
printf("read erro...n");
}
}
tcsetattr(fd,TCSANOW,&oldtio);
};
编译运行后接收其他机器的串口发字符,接受不到。我不明白为什么,是否是初始化有问题。/dev/ttyS0是表示COM1吗,直接使用就行了吗,用不用在LINUX下还装什么驱动之类的东西。另外机器上有两个COM口。是否另外一个就用/dev/ttyS1呢?
我将VMIN值定为10,希望收到10个字符就返回。还想 还想问一下这条语句fcntl(fd,F_SETFL,FASYNC);是什么意思?必须要用的吗?
另外,我还了解到可以直接用OUTB或者INB对串口的地址操作。好象COM1的地址是2F8。有哪为大侠有这方面的资料,请给小弟看看,不胜感激啊。
今天问题比较多。请大侠门辛苦辛苦。谢谢
|
/dev/ttyS0就是com1,comN是/dev/ttS(N-1);
VMIN=1比较好,希望收到10个字符就返回就在read的时候注明就行了;
fcntl(fd,F_SETFL,FASYNC);的意思大概就是设为异步模式,这时候read读不到东西就直接返回了,不等待,可能问题就在这里了。
没必要用OUTB或者INB;
你把fcntl(fd,F_SETFL,FASYNC);去掉试一试,另外,对串口操作需要有权限,你可以用root来试。
VMIN=1比较好,希望收到10个字符就返回就在read的时候注明就行了;
fcntl(fd,F_SETFL,FASYNC);的意思大概就是设为异步模式,这时候read读不到东西就直接返回了,不等待,可能问题就在这里了。
没必要用OUTB或者INB;
你把fcntl(fd,F_SETFL,FASYNC);去掉试一试,另外,对串口操作需要有权限,你可以用root来试。
|
#include /*标准输入输出定义*/
#include /*标准函数库定义*/
#include /*Unix 标准函数定义*/
#include
#include
#include /*文件控制定义*/
#include /*PPSIX 终端控制定义*/
#include /*错误号定义*/
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY
if (-1 == fd)
{
perror("Can't Open Serial Port");
return -1;
}
else
return fd;
}
/**
*@brief 设置串口通信速率
*@param fd 类型 int 打开串口的文件句柄
*@param speed 类型 int 串口速度
*@return void
*/
int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
};//B38400, B19200, B9600, B4800, B2400, B1200, B300,
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,
};//19200, 9600, 4800, 2400, 1200, 300,
void set_speed(int fd, int speed){
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i 0)
set_speed(fd,4800);
else
{
printf("Can't Open Serial Port!n");
exit(0);
}
if (set_Parity(fd,8,1,'N')== FALSE)
{
printf("Set Parity Errorn");
exit(1);
}
sprintf(buff, "1234567890");
while(1)
{
while((nread = write(fd,buff,10))>0)
{
printf("nLen %dn",nread);
buff[nread+1]='';
printf("n%s",buff);
sleep(2);
}
}
//close(fd);
//exit(0);
}
#include /*标准函数库定义*/
#include /*Unix 标准函数定义*/
#include
#include
#include /*文件控制定义*/
#include /*PPSIX 终端控制定义*/
#include /*错误号定义*/
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY
if (-1 == fd)
{
perror("Can't Open Serial Port");
return -1;
}
else
return fd;
}
/**
*@brief 设置串口通信速率
*@param fd 类型 int 打开串口的文件句柄
*@param speed 类型 int 串口速度
*@return void
*/
int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
};//B38400, B19200, B9600, B4800, B2400, B1200, B300,
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,
};//19200, 9600, 4800, 2400, 1200, 300,
void set_speed(int fd, int speed){
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i 0)
set_speed(fd,4800);
else
{
printf("Can't Open Serial Port!n");
exit(0);
}
if (set_Parity(fd,8,1,'N')== FALSE)
{
printf("Set Parity Errorn");
exit(1);
}
sprintf(buff, "1234567890");
while(1)
{
while((nread = write(fd,buff,10))>0)
{
printf("nLen %dn",nread);
buff[nread+1]='';
printf("n%s",buff);
sleep(2);
}
}
//close(fd);
//exit(0);
}