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和其他人的支持!