查看: 9101|回复: 14

[提问] 【求助】懂uclinux的进来,串口发送长字符串时出错。。

[复制链接]
发表于 2010-5-17 10:35:34 | 显示全部楼层 |阅读模式
关键词: uclinux , 串口 , 求助 , 字符
调试时候发送短的字符串没问题,长的字符串,大概到了20个字节就出问题了,而且前面的20个左右字节正确,后面的都错了,而且收到的字节也多了几个。
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include

  6. #define BAUDRATE B19200            
  7. #define SERIALDEVICE "/dev/ttyS1"
  8. int main()
  9. {
  10.         int fd,ncount;
  11.         struct termios oldtio,newtio;
  12.         char buf[]="This is a simple application for serial communication\r\n";
  13.         
  14.         fd = open(SERIALDEVICE, O_RDWR | O_NOCTTY );  //        打开串口1,UART1,O_SYNC表示是同步打开的就是要把数据全都写入才返回的。
  15.         if (fd <0)
  16.         {         
  17.                 perror(SERIALDEVICE);
  18.                 exit(-1);
  19.         }
  20.         
  21.         tcgetattr(fd,&oldtio);                                 //               
  22.         bzero(&newtio, sizeof(newtio));          //
  23.         
  24.         newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; //串口设置为波特率19200bps,8N1,
  25.         newtio.c_iflag = IGNPAR | ICRNL;         //        IGNPAR:忽略奇偶性错误;ICRNL:将回车符映射为换行符
  26.         newtio.c_oflag = 0;
  27.         newtio.c_lflag = ICANON;
  28.         
  29.         tcflush(fd, TCIFLUSH);
  30.         fcntl(fd,F_SETFL,0);                                 //        文件描述词操作
  31.         tcsetattr(fd,TCSANOW,&newtio);                 //        选择新的设置,TCSANOW:新设置立即生效
  32.         ncount=write(fd,buf,sizeof(buf));         //        往串口发送数据
  33.         printf("the bytes written to serial is %d\n",ncount);         //        发送的字符个数
  34.         printf("character to send is: %s\n",buf);                                 //        发送的字符串
  35.         perror("write");                                                                                 //        错误        
  36.         tcsetattr(fd,TCSANOW,&oldtio);
  37.         close (fd);
  38.         return 0;
  39. }
复制代码
发表于 2010-5-17 11:12:40 | 显示全部楼层
提示:xyj,你在分类中选择“提问”,你的帖子就跑到上边去了,这样总会被人看到
发表于 2010-5-17 11:13:32 | 显示全部楼层
怀疑是去驱动问题
发表于 2010-5-17 11:24:38 | 显示全部楼层
这样的破问题10有89是波特率问题

两边不太匹配,刚开始几个可以正确,到了后边每个bit的时间差累积多了,就会发生错误

这样以来短串问题都不大,长串肯定出问题

洗衣机你算一下你两个波特率的时间差,看20个bit的时候 是不是可以错开2/3个bit以上
发表于 2010-5-17 11:27:24 | 显示全部楼层
多谢成名和007。速度好快呀
发表于 2010-5-17 11:39:47 | 显示全部楼层
波特率最容易弄.
单片机搞个捕获中断,发送55看时间.
 楼主| 发表于 2010-5-17 12:13:55 | 显示全部楼层
应该是波特率的问题。。可是我设置的没问题。。
下面是测试的结果:


发送的字符:55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55

实际收到的字节:55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 FE
 楼主| 发表于 2010-5-17 15:27:53 | 显示全部楼层
我用示波器测了。。波形有问题,是发送端的问题,开始的20个字节都是以19200发送的,后面的好像是以9600发送的,还是串口设置的问题。。。。这是怎么回事呢。。?
 楼主| 发表于 2010-5-17 15:28:35 | 显示全部楼层
这样的破问题10有89是波特率问题

两边不太匹配,刚开始几个可以正确,到了后边每个bit的时间差累积多了,就会发生错误

这样以来短串问题都不大,长串肯定出问题

洗衣机你算一下你两个波特率的时间差,看20个 ...
lelee007 发表于 2010-5-17 11:24

发送端的波特率会变。。?
 楼主| 发表于 2010-5-17 15:28:52 | 显示全部楼层
提示:xyj,你在分类中选择“提问”,你的帖子就跑到上边去了,这样总会被人看到
老郭 发表于 2010-5-17 11:12

好了。。呵
发表于 2010-5-17 16:24:36 | 显示全部楼层
如果波特率的时钟有保障,那肯定是你的驱动的问题了

驱动里边把波特率给改了呗
发表于 2010-5-17 17:02:12 | 显示全部楼层
什么原因啊,洗衣机?真强,本科就搞linux。以俺裸奔的经验,你先看看你是不是用的usb转串口,那东东不值得信赖,再有就是底层驱动的原因了,希望楼主揭晓答案
 楼主| 发表于 2010-5-17 18:58:21 | 显示全部楼层
我搞定了。。谢谢各位。。
主要是我的测试程序有问题(随随便便找来的)。。。然后又换了个测试程序就有用了。
串口设置出的问题。。。。有的设置不知道是什么,然后就按照他的来了。。没仔细去看。。
发表于 2010-5-17 19:04:10 | 显示全部楼层
发表于 2010-5-17 19:42:27 | 显示全部楼层
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; //串口设置为波特率19200bps,8N1,
发表于 2010-5-18 09:24:18 | 显示全部楼层
楼上几位辛苦了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表