一个朋友的朋友做了基于OXFORD的PCI多串口卡做了一款工控产品,遇到了一些问题,请我帮忙。
问题描述为:在工控机器上运行Windows通信正常,但是运行Linux使用多串口卡的串口和外部主机通信有乱码出现,工控机上的操作系统是Debian 5.0,硬件是普通的x86机器。
我首先怀疑是波特率的问题,于是和他们的硬件工程师交流了一下,他们工程师说用示波仪测试过波特率没有问题。然后我自己用不同的波特率和外部主机进行通讯,发现出现的乱码的形式随着不同波特率有不同的变化。所以感觉还是有可能是串口速率的问题,但是尝试了所有的波特率,发现还是不能正常通讯。
因为Windows系统下,串口通讯正常,所以排除了是硬件的问题。有没有可能是Debian中的OXFORD的PCI驱动的问题呢?上网搜了搜,发现这款OXFORD的PCI多串口卡是一个普遍使用的设备,按照自己对Linux内核的经验,一个来自x86平台下被大家经常使用的设备出了问题,应该是会有人进行讨论,一般来说内核不会有问题。于是更仔细的搜索了一下maillist和论坛,终于发现了一篇很好的对OXFORD的多串口卡论述的帖子,如下链接:
http://www.austech.info/technical-development/17361-tips-newcs-linux-custom-baud-rates.html
摘录其中对我大有启发的一段如下:
On Windows it's usually sufficient to install the correct driver for your adapter hardware: the manufacturer knows exactly what UART chip is being used and what its reference frequency is.
On Linux the same applies: if the manufacturer supplies a driver (binary or source) then use it. If they don't it's usually because they're compatible with one of the standard UART types, which means you can use Linux's standard serial driver. But it will ONLY work properly with non-standard baud rates if you correctly configure the uart_type and baud_base parameters. This is done using setserial command, which is the tool you use to configure the parameters of the kernel's standard serial driver.
简单的来说,就是windows上使用的多串口卡的驱动是厂商自带的,而Linux上使用的驱动往往是开源社区写的,并且是面向通用串口的驱动。所以linux上的驱动程序针对OXFORD需要进行配置。
而我们工控板上的驱动如果不经过配置的话,速率是普通串口相同波特率下的十倍速率,采用setserial程序调整一下工控板上的串口速率从而解决了乱码的问题。
Thanks
MK