|
自己最近写了一个串口通信程序,把pc机的com1和com2用串口交叉线联接起来,然后运行两个分别独立的程序(两个程序的区别只是在于ttys0或ttys1)打开com1和com2进行调试.为了测试的方便,把串口参数的设置缩减到最少,使用了系统原来默认的9600B,8N1的工作模式.测试结果基本正常,但有些小问题一直搞不清楚.下面先列出程序,后面再提出我的问题
- #include <stdio.h> /*标准输入输出定义*/
- #include <stdlib.h> /*标准函数库定义*/
- #include <unistd.h> /*Unix 标准函数定义*/
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h> /*文件控制定义*/
- #include <termios.h> /*POSIX 终端控制定义*/
- #include <errno.h> /*错误号定义*/
- main()
- {int fd,selnum,nread,nsend;
- int i;
- char databuff[32];
- struct termios opt;
- /*打开串口*/
- fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY);/*打开com1*/
- //fd=open("/dev/ttyS1",O_RDWR|O_NOCTTY);/*打开com2*/
- if (fd==-1) {printf("open port error\n"); goto END;}
- /*串口设置*/
- tcgetattr(fd,&opt);
- opt.c_oflag&=~OPOST;
- tcsetattr(fd,TCSANOW,&opt);
- fcntl(fd,F_SETFL,0);
- /*选择工作模式*/
- printf("Select the operation mode:\n");
- printf("1: Send data\n2: Receive data\n3: exit\n");
- scanf("%d",&selnum);
- if (selnum!=1&&selnum!=2&&selnum!=3) {printf ("Wrong number had been selected\n");goto END;}
- /*发送数据部分*/
- if (selnum==1)
- {printf("Enter the message you want to send:\n");
- getchar();
- i=0;
- for ( ;(databuff[i]=getchar())!='\n'; ) i++;
- databuff[i]='\0';
- nsend=write(fd,databuff,32);
- if (nsend<0) printf("send data error\n");
- }
- /*接收数据部分*/
- else if (selnum==2)
- {if((nread=read(fd,databuff,32))>0)
- {printf("%s\n",databuff);}
- else {printf("no message received\n");}
- }
- /*程序结束*/
- else printf("Closing the progrom\n");
- END:close(fd);
- printf("The program is closed\n");
复制代码
问题:
1程序中定义的数组是32的,理论上可以发送32个char的字符(包括最后一位结束符"/0"),如果发送的字符小于30,程序工作正常,但如果把32位填满,接收程序将无法接收.但是如果采用window下的串口调试助手接收,发送还是使用原来的程序,即使把32位填满还是可以正常接收.而用串口调试助手发送数据,用我的程序接收,还是接收不到,所以我估计是接收部分的问题,但看来看去都看不出什么问题,所以请各位高手指教.
2记得看资料是串口通信是可以实现超时退出的功能,我试着修改程序如下:
把"fcntl(fd,F_SETFL,0);"这行删掉,从而取消串口接收堵塞工作模式.
在"tcsetattr(fd,TCSANOW,&opt);"这行上面加上"opt.c_cc[VMIN]=0;opt.c_cc[VTIME]=10;"然后运行接收程序但其始终不能实现超时自动退出.这又是为什么?
3如果把发送部分改成循环发送8次的,也就是说在设置串口参数之后连续发送八次,无论是采用自己的程序接收还是采用串口调试助手接收,结果都是一样(前三次正常,接下来两次乱码,然后又是三次正常).按理说串口应该是可以连续发送的,出现这种情况真是有些令人费解.
以上种种情况,还请各位帮忙研究研究,在这里先谢谢各位了. :p |
|