LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 836|回复: 1

自己写的一个简单的串口通信程序,帮忙看看

[复制链接]
发表于 2003-10-20 11:06:13 | 显示全部楼层 |阅读模式
自己最近写了一个串口通信程序,把pc机的com1和com2用串口交叉线联接起来,然后运行两个分别独立的程序(两个程序的区别只是在于ttys0或ttys1)打开com1和com2进行调试.为了测试的方便,把串口参数的设置缩减到最少,使用了系统原来默认的9600B,8N1的工作模式.测试结果基本正常,但有些小问题一直搞不清楚.下面先列出程序,后面再提出我的问题

  1. #include     <stdio.h>      /*标准输入输出定义*/
  2. #include     <stdlib.h>     /*标准函数库定义*/
  3. #include     <unistd.h>     /*Unix 标准函数定义*/
  4. #include     <sys/types.h>   
  5. #include     <sys/stat.h>   
  6. #include     <fcntl.h>      /*文件控制定义*/
  7. #include     <termios.h>    /*POSIX 终端控制定义*/
  8. #include     <errno.h>      /*错误号定义*/

  9. main()
  10. {int fd,selnum,nread,nsend;
  11. int i;
  12. char databuff[32];
  13. struct termios opt;

  14. /*打开串口*/

  15. fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY);/*打开com1*/
  16. //fd=open("/dev/ttyS1",O_RDWR|O_NOCTTY);/*打开com2*/
  17. if (fd==-1) {printf("open port error\n"); goto END;}

  18. /*串口设置*/

  19. tcgetattr(fd,&opt);
  20. opt.c_oflag&=~OPOST;
  21. tcsetattr(fd,TCSANOW,&opt);
  22. fcntl(fd,F_SETFL,0);

  23. /*选择工作模式*/

  24. printf("Select the operation mode:\n");
  25. printf("1: Send data\n2: Receive data\n3: exit\n");
  26. scanf("%d",&selnum);
  27. if (selnum!=1&&selnum!=2&&selnum!=3) {printf ("Wrong number had been selected\n");goto END;}

  28. /*发送数据部分*/

  29. if (selnum==1)
  30.         {printf("Enter the message you want to send:\n");
  31.         getchar();
  32.         i=0;
  33.         for ( ;(databuff[i]=getchar())!='\n'; ) i++;
  34.         databuff[i]='\0';

  35.         nsend=write(fd,databuff,32);
  36.         if (nsend<0) printf("send data error\n");
  37.         }

  38. /*接收数据部分*/

  39. else if (selnum==2)
  40.         {if((nread=read(fd,databuff,32))>0)
  41.                 {printf("%s\n",databuff);}
  42.         else {printf("no message received\n");}
  43.         }

  44. /*程序结束*/

  45. else        printf("Closing the progrom\n");

  46. END:close(fd);
  47. 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
发表于 2003-10-20 15:46:51 | 显示全部楼层
请设置TTS的模式为非规范方式:
c_lflag &= ~ICANON;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表