【求助】懂uclinux的进来,串口发送长字符串时出错。。
2010年05月17日 10:35 发布者:xyj
调试时候发送短的字符串没问题,长的字符串,大概到了20个字节就出问题了,而且前面的20个左右字节正确,后面的都错了,而且收到的字节也多了几个。#include #include
#include
#include
#include
#define BAUDRATE B19200
#define SERIALDEVICE "/dev/ttyS1"
int main()
{
int fd,ncount;
struct termios oldtio,newtio;
char buf[]="This is a simple application for serial communication\r\n";
fd = open(SERIALDEVICE, O_RDWR | O_NOCTTY ); // 打开串口1,UART1,O_SYNC表示是同步打开的就是要把数据全都写入才返回的。
if (fd <0)
{
perror(SERIALDEVICE);
exit(-1);
}
tcgetattr(fd,&oldtio); //
bzero(&newtio, sizeof(newtio)); //
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; //串口设置为波特率19200bps,8N1,
newtio.c_iflag = IGNPAR | ICRNL; // IGNPAR:忽略奇偶性错误;ICRNL:将回车符映射为换行符
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
tcflush(fd, TCIFLUSH);
fcntl(fd,F_SETFL,0); // 文件描述词操作
tcsetattr(fd,TCSANOW,&newtio); // 选择新的设置,TCSANOW:新设置立即生效
ncount=write(fd,buf,sizeof(buf)); // 往串口发送数据
printf("the bytes written to serial is %d\n",ncount); // 发送的字符个数
printf("character to send is: %s\n",buf); // 发送的字符串
perror("write"); // 错误
tcsetattr(fd,TCSANOW,&oldtio);
close (fd);
return 0;
}
网友评论
一朝成名 2010年05月17日
怀疑是去驱动问题
怀疑是去驱动问题
lelee007 2010年05月17日
这样的破问题10有89是波特率问题
两边不太匹配,刚开始几个可以正确,到了后边每个bit的时间差累积多了,就会发生错误
这样以来短串问题都不大,长串肯定出问题
洗衣机你算一下你两个波特率的时间差,看20个bit的时候 是不是可以错开2/3个bit以上
这样的破问题10有89是波特率问题
两边不太匹配,刚开始几个可以正确,到了后边每个bit的时间差累积多了,就会发生错误
这样以来短串问题都不大,长串肯定出问题
洗衣机你算一下你两个波特率的时间差,看20个bit的时候 是不是可以错开2/3个bit以上
老郭 2010年05月17日
多谢成名和007。速度好快呀
多谢成名和007。速度好快呀
huangqi412 2010年05月17日
波特率最容易弄.
单片机搞个捕获中断,发送55看时间.
波特率最容易弄.
单片机搞个捕获中断,发送55看时间.
xyj 2010年05月17日
应该是波特率的问题。。可是我设置的没问题。。
下面是测试的结果:
发送的字符: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
应该是波特率的问题。。可是我设置的没问题。。
下面是测试的结果:
发送的字符: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
xyj 2010年05月17日
我用示波器测了。。波形有问题,是发送端的问题,开始的20个字节都是以19200发送的,后面的好像是以9600发送的,还是串口设置的问题。。。。这是怎么回事呢。。?
我用示波器测了。。波形有问题,是发送端的问题,开始的20个字节都是以19200发送的,后面的好像是以9600发送的,还是串口设置的问题。。。。这是怎么回事呢。。?
xyj 2010年05月17日
这样的破问题10有89是波特率问题
两边不太匹配,刚开始几个可以正确,到了后边每个bit的时间差累积多了,就会发生错误
这样以来短串问题都不大,长串肯定出问题
洗衣机你算一下你两个波特率的时间差,看20个 ...
lelee007 发表于 2010-5-17 11:24 http://www.eechina.com/images/common/back.gif
发送端的波特率会变。。?
这样的破问题10有89是波特率问题
两边不太匹配,刚开始几个可以正确,到了后边每个bit的时间差累积多了,就会发生错误
这样以来短串问题都不大,长串肯定出问题
洗衣机你算一下你两个波特率的时间差,看20个 ...
lelee007 发表于 2010-5-17 11:24 http://www.eechina.com/images/common/back.gif
发送端的波特率会变。。?
xyj 2010年05月17日
提示:xyj,你在分类中选择“提问”,你的帖子就跑到上边去了,这样总会被人看到
老郭 发表于 2010-5-17 11:12 http://www.eechina.com/images/common/back.gif
好了。。呵
提示:xyj,你在分类中选择“提问”,你的帖子就跑到上边去了,这样总会被人看到
老郭 发表于 2010-5-17 11:12 http://www.eechina.com/images/common/back.gif
好了。。呵
lelee007 2010年05月17日
如果波特率的时钟有保障,那肯定是你的驱动的问题了
驱动里边把波特率给改了呗
如果波特率的时钟有保障,那肯定是你的驱动的问题了
驱动里边把波特率给改了呗
kbgyzp 2010年05月17日
什么原因啊,洗衣机?真强,本科就搞linux。以俺裸奔的经验,你先看看你是不是用的usb转串口,那东东不值得信赖,再有就是底层驱动的原因了,希望楼主揭晓答案
什么原因啊,洗衣机?真强,本科就搞linux。以俺裸奔的经验,你先看看你是不是用的usb转串口,那东东不值得信赖,再有就是底层驱动的原因了,希望楼主揭晓答案
xyj 2010年05月17日
我搞定了。。谢谢各位。。
主要是我的测试程序有问题(随随便便找来的)。。。然后又换了个测试程序就有用了。
串口设置出的问题。。。。有的设置不知道是什么,然后就按照他的来了。。没仔细去看。。
我搞定了。。谢谢各位。。
主要是我的测试程序有问题(随随便便找来的)。。。然后又换了个测试程序就有用了。
串口设置出的问题。。。。有的设置不知道是什么,然后就按照他的来了。。没仔细去看。。
lelee007 2010年05月17日
:L
:L
linux_Ultra 2010年05月17日
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; //串口设置为波特率19200bps,8N1,
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; //串口设置为波特率19200bps,8N1,
riverpeak 2010年05月18日
楼上几位辛苦了
楼上几位辛苦了
提示:xyj,你在分类中选择“提问”,你的帖子就跑到上边去了,这样总会被人看到