红联Linux门户
Linux帮助

还是LINUX的串口,编译通过了,如何控制输入输出?

发布时间:2011-06-13 11:04:30来源:红联作者:辛昕
之前发的帖子的问题已经解决了:解决的办法不是个通法,因为我还不太懂的如何编译多源文件,我就把它们集中到一起。
暂时过关了。然后现在已经能够通过串口发送数据到串口助手上了。

可是我遇到的一个问题是:
那个例程是一个很简单的例程,只有简单的打开串口和写读数据,缺乏对收发的控制和状态检测。

所以,我遇到的问题有,比方说,我先发送一串字符串,再发送一个字符。
实际上,我只收到字符串,而没有收到后面的那个字符,我们初步分析这是由于前面的字符串还没发送完毕,由于什么原因,把后面的屏蔽了。

程序中这么写:
write(fd,&send,1); //这里发的是 a
write(fd,word,32); //这里发的是“ Serial Port Comunicating...”
write(fd,&re,1); //这里发的是b

但是,在串口助手上,如你所见,我收到的只有:
aSerial Port Comunicating...

然后,在上面这三条指令过后,我做了一个死循环,现在是尝试,想要找到错误信息,所以里面只有一个printf语句和read函数:
//-----------------Continue R/W Operate---------------------
while(1)
{


//Show the value get from keyboard.
write(fd,&send,1);
//Show the value get from serial-tool.
write(fd,&re,1);
//------------------------------------
read(fd,&re,1);
printf("Next...\n");
}
而在串口助手上,我不通过它发送一个什么东西犹好,只要我随便发送一个什么,只消一会,串口助手上就开始乱码,然后,SSH终端就出现死循环,就是一直NEXT。。。
NEXT...

这里有一点很奇怪,不知为何,它没有显示
//Show the value get from keyboard.
write(fd,&send,1);
//Show the value get from serial-tool.
write(fd,&re,1);
这两条指令的输出,我们认为其原因与上面没有显示出“b”是一样的。

我们分析了一下,是这么估计的:
我们的read函数,一开始的时候由于没有通过串口输入东西,其buffer里面是空的,因此它一直在等待,这里猜测用的是 阻塞方式。
可是后来一旦我们输入一次,它就有了,然后就拼命重发这个字符的内容。
所以,以后就陷入了死循环。

所以,我们首先想要解决的问题是,如何能找到一个方法,或者一个什么函数来检测串口收发状态,再进行判断和再发再收。
但是,网上的这一个内容的资料,绝大多数都十分相似,和我看的那本书的例程大同小异,都没有怎么提到这些内容,而我看到的一份老外的写的,也就是大名鼎鼎的:


Serial Programming Guide for POSIX Operating Systems

5th Edition
Michael R. Sweet
Copyright 1994-1999, All Rights Reserved.

它是很详细的,但是,也没有特别提到这方面如何实现。很多设置很杂乱,散布得很,我一直没找到如何设置。
提供的几个函数,查了一下,好像都不是那么一回事。
目前查阅过的函数有:
tcgetattr( ) ;
tcflush( );
tcsetattr( );
以及 tcdrain();

所以,发帖请教一下,希望做过的朋友可以指条路,知道往那里下手,谢谢了!
文章评论

共有 2 条评论

  1. 辛昕 于 2011-06-13 16:51:01发表:

    刚才分析了一下,原来一直以来都只是发送成功,接收没有成功过,之所以让我误以为有接收,可能是那个串口助手本身有回显功能,或者对串口不了解,引起的。
    但是想不明白,为什么接收不到。
    已经设置成可读可写了。

  2. badgc 于 2011-06-13 14:39:38发表:

    帮顶