当前位置: 技术问答>linux和unix
LINUX RS485串口编程
来源: 互联网 发布时间:2015-08-07
本文导语: 目前PC的串口是RS232的,受制于传输距离的限制,我们公司的硬件工程师在PC原有RS232串口的基础上做了改进,改为RS485的,但这样一来,LINUX原来的驱动就不能用了,所以要写新的驱动。硬件工程师告知我,RS232是全双...
目前PC的串口是RS232的,受制于传输距离的限制,我们公司的硬件工程师在PC原有RS232串口的基础上做了改进,改为RS485的,但这样一来,LINUX原来的驱动就不能用了,所以要写新的驱动。硬件工程师告知我,RS232是全双工的,而RS485是半双工的,需要通过修改其I/O端口的寄存器的值,改为半双工通信。
但我考虑了一下,RS232是内核本来就支持的,重写驱动必然会很耗时,而且我也没这个能耐,如果通过重新
编译新内核的办法解决,但又发现内核配置中没这个选项,直接修改内核源代码似乎也行不通,而已有的对RS232进行设置的系统调用也没有能将其设置为半双工通信的参数选项。这可难倒了我了!!
现在我的想法是仍然调用LINUX提供的系统调用来设置比如波特率,停止位,数据位和校验,另外写一个函数
在用户空间设置串口的参数尤其是直接修改I/O端口的寄存器的方法,将其设置为半双工通信模式,
我想到的函数有:
ioperm();
iopl();
iocntl();
我就知道这些了,请问哪位大侠做过类似的实现,或有更好的解决办法,望不吝赐教,小弟不胜感激!!!
还有就是如果重写驱动,原有的驱动程序和设备结点文件的主设备号将会与新驱动的主设备号发生冲突,这个问题如何来解决!!
谢谢了!!
但我考虑了一下,RS232是内核本来就支持的,重写驱动必然会很耗时,而且我也没这个能耐,如果通过重新
编译新内核的办法解决,但又发现内核配置中没这个选项,直接修改内核源代码似乎也行不通,而已有的对RS232进行设置的系统调用也没有能将其设置为半双工通信的参数选项。这可难倒了我了!!
现在我的想法是仍然调用LINUX提供的系统调用来设置比如波特率,停止位,数据位和校验,另外写一个函数
在用户空间设置串口的参数尤其是直接修改I/O端口的寄存器的方法,将其设置为半双工通信模式,
我想到的函数有:
ioperm();
iopl();
iocntl();
我就知道这些了,请问哪位大侠做过类似的实现,或有更好的解决办法,望不吝赐教,小弟不胜感激!!!
还有就是如果重写驱动,原有的驱动程序和设备结点文件的主设备号将会与新驱动的主设备号发生冲突,这个问题如何来解决!!
谢谢了!!
|
如果有电路图我可以帮你。
但是,一般来说,硬件工程师的做法是将RS232加转换电路成RS485接口电平,编程是不变的。你也可以用232/485转换器来连接。你是ARM?
但是,一般来说,硬件工程师的做法是将RS232加转换电路成RS485接口电平,编程是不变的。你也可以用232/485转换器来连接。你是ARM?
|
主从方式 需要注意的是效验位设置 主要是space和mark效验来发送地址。这里不详细
说 看看一些单片机硬件方面的书就可以。
说 看看一些单片机硬件方面的书就可以。
|
应该没那么麻烦,RS485也是遵循RS232协议,只是在你的程序中发的同时不要接收,或者接收的同时不要发送,实际上发是发不出去的。
|
应该没那么麻烦,RS485也是遵循RS232协议,只是在你的程序中发的同时不要接收,或者接收的同时不要发送,实际上发是发不出去的。
|
根本不用什么新的驱动就可以了!232是对485透明通讯,只要你没发送的时候,别去接受就可以了,接受的时候,别去发送就可以了!他们没什么区别,所谓硬件更改只是电压匹配而已,并非uart改动,所以,很简单了吧?对你来说,就当作半双工的232就可以了
http://www.morning-tech.com
http://www.morning-tech.com
|
使用RS232转换RS485的转换器 120元可以买到 只是编写程序需要改为半双工 如果使用RS485
的网络,可以参考RS232的主从方式编程。windows下我是这样做的。Linux下我只做过RS232
应该是可以的。我测试过转换器发送接受数据,但是没有测试主从方式来查询发送!
的网络,可以参考RS232的主从方式编程。windows下我是这样做的。Linux下我只做过RS232
应该是可以的。我测试过转换器发送接受数据,但是没有测试主从方式来查询发送!
|
485和232,编程是不变的
|
用个硬件转化器不久可以了么
|
买一个转换器就行了,之间的差异可以由转换器来解决,现在还有增强型的232-485转换器,功能好强的。
比你直接写驱动好多了
比你直接写驱动好多了
|
偶遇到的问题正是space和mark校验方面的,linux本身不支持这两种校验方式。偶用嵌入式linux做下位机的时候很容易的实现了这两种校验,只要设置一下ARM芯片的相关寄存器就行了。但PC机上的Ret hat Linux不知道怎么修改驱动才能支持?好像Ret hat Linux的串口驱动文件不是直接使用寄存器的。
|
看看硬件如何设计的。
其实应该没有什么关系的。我以前买了个232-485转换器,就在pc上和485设备通信了。
其实应该没有什么关系的。我以前买了个232-485转换器,就在pc上和485设备通信了。