关于嵌入式:OS X VS Linux-串行端口处理

OS X Vs Linux - Serial port handling

我正在尝试将纯Linux应用程序移植(或自定义)到OS X Snow Leopard(10.6.4)。它是一个通过串行端口将二进制文件发送到目标硬件的应用程序。该应用程序即将运行,但是我遇到了一个有趣的串行端口写入问题。

使用与Linux相同的设置(波特率为115.2k),与Linux相比,OS X串行数据的发送速度似乎慢了10倍甚至更多。在Linux中需要3秒钟,而在30到40秒钟之内,到那时接收端的目标固件就会超时:)。

深入到串行端口写入功能,我发现它正在使用select()系统调用来查找设备(或更确切地说是文件描述符)是否已准备好向其中写入数据。每个写系统调用在OS X中写1024字节的数据,在Linux中写1087字节的数据(这就是写的返回值)。对于一级二进制文件,我的数据大小约为50KB(这是一个小型引导程序,可以在下一级加载较大的二进制文件)。

伪代码

1
2
3
4
5
6
7
8
    select() configuration with 1s time out and observing the serial port file descriptor for write ready.
while(true)
{
rc=select(...)
if(rc>0){write(...) and other logic to get out of while if done}
if(rc==0){//try again}
if(rc<0){//error}
}

我观察到在Linux中,写入一直在发生。一连串的写入,然后就从函数中浮出水面。但是,在OS X中,这就像3次写入,然后select两次返回零(消失了2秒),再次写入了几次,然后选择了超时等,这使得该功能变慢了。

有任何线索吗?

注意:
该应用程序使用termios lib API来控制串行端口。


我可以通过更改多产的芯片设备驱动程序来解决此问题。默认情况下,它使用的是非标准的开源驱动程序,我从多产的网站上下载了OS X驱动程序,并且工作正常。
感谢Nils和其他人的支持!