【求助】懂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日
提示:xyj,你在分类中选择“提问”,你的帖子就跑到上边去了,这样总会被人看到
一朝成名 2010年05月17日
怀疑是去驱动问题
lelee007 2010年05月17日
这样的破问题10有89是波特率问题

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

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

洗衣机你算一下你两个波特率的时间差,看20个bit的时候 是不是可以错开2/3个bit以上
老郭 2010年05月17日
多谢成名和007。速度好快呀
huangqi412 2010年05月17日
波特率最容易弄.
单片机搞个捕获中断,发送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
xyj 2010年05月17日
我用示波器测了。。波形有问题,是发送端的问题,开始的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
发送端的波特率会变。。?
xyj 2010年05月17日
提示:xyj,你在分类中选择“提问”,你的帖子就跑到上边去了,这样总会被人看到
老郭 发表于 2010-5-17 11:12 http://www.eechina.com/images/common/back.gif
好了。。呵
lelee007 2010年05月17日
如果波特率的时钟有保障,那肯定是你的驱动的问题了

驱动里边把波特率给改了呗
kbgyzp 2010年05月17日
什么原因啊,洗衣机?真强,本科就搞linux。以俺裸奔的经验,你先看看你是不是用的usb转串口,那东东不值得信赖,再有就是底层驱动的原因了,希望楼主揭晓答案
xyj 2010年05月17日
我搞定了。。谢谢各位。。
主要是我的测试程序有问题(随随便便找来的)。。。然后又换了个测试程序就有用了。
串口设置出的问题。。。。有的设置不知道是什么,然后就按照他的来了。。没仔细去看。。
lelee007 2010年05月17日
:L
linux_Ultra 2010年05月17日
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; //串口设置为波特率19200bps,8N1,
riverpeak 2010年05月18日
楼上几位辛苦了