日期:2014-05-16  浏览次数:20601 次

LINUX串口只能发送不能接收
简单说明一下情况:
我用的是 PC机 上 虚拟机 GCC交叉编译,然后在装有 LINUX系统 的 TI 开发板 DM3730(达芬奇系列多媒体处理器)上跑程序。
开发板本身带有USB鼠标键盘,和DVI或者VGA等视频接口,因此可以通过显示器,鼠标,键盘等构成一个计算机。
还有一个和这个问题可能很重要的是:
这个开发板系统通过一个串口与PC机通信,主要用于返回开机信息和一些系统运行过程中出现的一些返回信息。3730本身带3个串口,这个返回信息用的用的是串口0.[b][/b]

然后上班的一个任务是写一个LINUX的串口收发数据程序。
老板出于某种考虑,只让我用回那个串口0来做收发。

我找到一个例程,照着弄,折腾了一阵子后跑通了。
但是出现的问题是:
用write函数串口发送是没问题的,但是用read函数读取却不行。

具体表现如下:
1 发送,发送当然是没问题。
2 接收,一开始,我在串口助手上自动发送,运行程序后发现有接收到,我误以为已经成功了。
但是后来进一步调试时发现其实不是那么一回事,用read函数的返回值一检查,果然是-1,也就是说,根本就没成功读取过。至于 串口助手 的接收,我至今不能完全理解。
我目前的理解是:那个缓冲区中早被塞满了,所以它只是在自动发送时,被不断“挤出来”而已。

还有一种比较恐怖的现象是:
一经运行过程序,哪怕程序已经停止,退了出来。如果我的串口助手仍在 自动发送,那么,接收区依然一直地在“自动回显”。
甚至是关一次自动发送再来还是会,直到一阵子以后,出现乱码,这种情形才停下来。
这种情况,我试过关掉串口助手,再打开,也还是会持续。[size=12px][/size][b][/b]


后来,我们想,是不是因为系统用了串口0做了终端,所以这个串口被占用了。
我们在开发板上,用minicom想打开它,发现它的确写着 串口0被锁了。

但是我目前还没找到解锁或者说取消这个终端的命令和方法。[size=12px][/size][b][/b]

另外,补充一下的是:
在程序中,我已经做了这样一些操作。

1 首先,这个串口不作为终端,同时可读可写:
int fd = open(dev,O_RDWR | O_NOCTTY | O_NONBLOCK);

2 我已经设置为非RAM模式,就是非堵塞模式:
//NONE_RAM mode
fcntl(fd, F_SETFL, FNDELAY);  

但是貌似没啥区别。

3 在每一次读取中,我先发一个 57,然后在一个5次循环中 进行5次读取,每一次读取中,我都首先 清空收发缓冲区
tcflush(fd, TCIOFLUSH); 

但是,貌似也没用

4 波特率都是9600




------解决方案--------------------
这个情况我遇到过,当时是配置的问题,你查一下c_cflag,c_iflag什么的都设置好了没