大家一定要帮我,linux下串口通讯问题

solly 2003-12-23 10:59:48
我在linux下串口通讯是碰到如下问题。我用两台机器来实现串口通讯问题。但在接收是出现如下问题:
我发送了四组数据
第一组:abcdefghijklmnopqrstuvwxyz
第二组:ABCDEFGHIJKLMNOPQRSTUVWXYZ
第三组:abcdefghijklm
第四组:ABCDEFGHIJKLM
接收到的数据
第一组:abcdefghijklmnopqrstuvwxyz
第二组:ABCDEFGHIJKLMNOPQRSTUVWXYZ
第三组:abcdefghijklmNOPQRSTUVWXYZ
第四组:ABCDEFGHIJKLMabcdefghijklm

我的程序代码如下
串口初始化
int FskAgent::InitCom(char *cCom)
{
fd = open(cCom, O_RDWR | O_NOCTTY);
if (fd < 0)
{
return 0;
}

fcntl(fd,F_SETFL,FASYNC);
tcgetattr(fd, &oldtio);

//newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_cflag = B38400 | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VMIN] = 1;
newtio.c_cc[VTIME] = 0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);
tcgetattr(0, &oldstdtio);
tcgetattr(0, &newstdtio);
newstdtio.c_lflag &= ~(ICANON | ECHO);
tcsetattr(0, TCSANOW, &newstdtio);
return 1;
}

读取数据
void FskAgent::ReadCom(char *cInceptMsg)
{
int i = 0;
read(fd, cInceptMsg, 1000);
cInceptMsg[strlen(cInceptMsg)] = 0x00;

printf(" Buf length is : %d \n",strlen(Buf));
for(i = 0 ; i < 44 ; i++)
printf("[#0x%2x]\n",Buf[i]);
}

各位,请仔细帮我分析一下,看看是初始化是出现了问题还是在我读取串口数据时出现了问题。我一定高分相送。
...全文
258 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanlei1978113 2004-02-10
  • 打赏
  • 举报
回复
一个字节一个字节得读,没有的时候它应该会堵塞,就不会出现这样的问题了。
Johna_aalin 2004-02-10
  • 打赏
  • 举报
回复
同意 yaxii(笑影) 的说法。
daidai_____DD 2003-12-25
  • 打赏
  • 举报
回复
我想你是发送端有点问题。
建议你每次定义发送缓冲区时先清空,发送四次,清空四次
接收时也是如此,每次接收前,清空缓冲区,用bzero,或者memset.
获取长度时不要用strlen(Buf),而要用read函数的返回值。
holymoon 2003-12-24
  • 打赏
  • 举报
回复
把你完整的程序贴出来,只是一个片断实在不好看.
solly 2003-12-24
  • 打赏
  • 举报
回复
多谢大家的积极回帖,问题还是没有解决,希望大家积极参与
holymoon 2003-12-24
  • 打赏
  • 举报
回复
你的发送端的程序呢,可否贴出来看看?
holymoon 2003-12-23
  • 打赏
  • 举报
回复
读取数据出错!
int rlen;
char rdata[1000];
rlen=read(fd,rdata,1000);
if ( rlen <0)
return ;
rdata[rlen]='\0';

printf("\n read data: %s", rdata);

原因是你读取 的数据(字符串)没有字符串结束符号 '\0',所以缓冲区的结束符号是以前读取最长的数据的结束符号.
solly 2003-12-23
  • 打赏
  • 举报
回复
各位为何不跟帖,跟帖有分。
solly 2003-12-23
  • 打赏
  • 举报
回复
估计不是这个地方的问题,我每次都清空也试过,我估计不是这方面的问题,可能是与串口的设置方面有关系。
tigermaomaolaoliu 2003-12-23
  • 打赏
  • 举报
回复
每次读之前先把cInceptMsg清空
solly 2003-12-23
  • 打赏
  • 举报
回复
多谢你的跟帖,buf是输入错误,其实就是指cInceptMsg,我只是向打印读取到的数据的长度。我试了cInceptMsg[i] = 0x00,好像还是一样,郁闷。
holymoon 2003-12-23
  • 打赏
  • 举报
回复
问一个问题:
你的 Buf用在什么地方的?
这样试试吧

void FskAgent::ReadCom(char *cInceptMsg)
{
int i = 0;
i=read(fd, cInceptMsg, 1000);
if (i<0)
return ;
cInceptMsg[i] = 0x00;

printf(" Buf length is : %d \n",i);
printf("\n read data: %s",clnceptMsg);


}
solly 2003-12-23
  • 打赏
  • 举报
回复
rdata[rlen]='\0';,还是一样的问题呀可能不是这个原因。麻烦你继续帮我看看

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧