免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7479 | 回复: 6

[驱动] 串口终端和串口驱动调用的问题 [复制链接]

论坛徽章:
0
发表于 2011-07-14 15:46 |显示全部楼层
20可用积分
平台:arm9的s3c2440板+ linux-2.6.30内核+uboot1.3.4
硬件连接串口1,无其他串口

目前的工作是用串口连接其他主机,用自定义协议,完成数据传输

boot设定console为串口1,系统启动后,可在/dev下看到console、ttyS1以及s3c2410_serial1设备节点
分别用open打开这三个节点,配置驱动为raw模式,调用write,均可从串口输出字符,但调用read,只有s3c2410_serial1可读取,其他节点驱动返回错误值-1
通过串口工具发送16进制0x00、0x01........0xa、0xb、0xc、0xd.......给板子,read调用接收丢数据,0x0、0x1基本收不到,0x0d也基本变成0a

目前分析,由于只有一个串口,被系统调用,0x0、0x1这类非法字符被系统滤掉了,而0a、0d这类换行回车被系统重定义了
这样的话就无法完成自定义协议的数据传输,即使在重新打开驱动时候设置raw模式,由于系统的优先级高于当前进程,而且仍然被系统调用,特殊字符仍无法正常传输

目前的想法是,如果在使用串口驱动的时候能终止系统终端的调用,在完成工作后,再恢复系统终端的调用,请问如何实现?


PS:目前一个方案是,在boot中不为系统设定console,这样在系统启动后,串口驱动就可被当前进程独占,设置raw模式后,可以正常完成数据的传输,但问题是,在当前进程结束后,系统以及其他进程就无法调用串口,使用串口终端,由于终端设定一般是在boot中传参给内核,以及inittab这类启动脚本中,一旦系统系统启动,就无法更改
请问,有什么办法可以在系统启动后,重新设定系统终端为串口?

请大家帮忙解答,谢谢!

最佳答案

查看完整内容

因为 console 即 文件描述符 0, 1, 2 是在内核启动拉起第一个内核线程init时定义的。所以如果这时找不到console设备就已经会报错了。这个设备不应等到用户空间的的程序生成节点。

论坛徽章:
0
发表于 2011-07-14 15:46 |显示全部楼层
因为 console 即 文件描述符 0, 1, 2 是在内核启动拉起第一个内核线程init时定义的。所以如果这时找不到console设备就已经会报错了。这个设备不应等到用户空间的的程序生成节点。

论坛徽章:
0
发表于 2011-07-14 17:18 |显示全部楼层
$ man termios
配置对了属性后,是可以同时使用的。

另外,用你的方案,可以考虑使用 usbserial 的 驱动,通过usb 拉起 shell 来进行交互。

论坛徽章:
0
发表于 2011-07-17 08:52 |显示全部楼层
回复 2# linyunxian
感谢你的回复!

关于termios的设定,我认为是没有问题的,在串口驱动被独占的时候(没有为系统指定串口),用raw模式经串口收发数据是没有问题的

你提出的用usbserial驱动的,前提是不是硬件板上得有usb主从口设备,然后调用驱动?目前我的板上没有usb接口,内核中也没有添加usb驱动

目前还发现的一个现象就是:在制作根文件系统的时候,手动添加了console节点;如果没有手动添加console节点,在启动mdev之后,系统也会自动添加console节点,但是无法通过串口进入终端。
在为系统设定串口1为控制终端的前提下,如果在根文件系统建立时,手动添加console节点,那么,进入系统后,调用串口驱动,即使设定raw模式,串口也无法正常接收全部字符(如0a、0d、0x01、0x00);如果不手动添加console节点,由系统自建console,那么,在进入系统后,调用串口驱动,设定raw模式,串口是可以正常接收全部数据的。
不知道这样的现象是如何造成的?

论坛徽章:
0
发表于 2011-07-17 14:44 |显示全部楼层
回复 3# zhongfrank


    tty 子系统没细看,不过看现象可能tty是独占的。 可以试试 pty 设备,看看是否能满足你的要求。

论坛徽章:
0
发表于 2011-08-25 19:05 |显示全部楼层
回复 2# linyunxian
很不好意思这么久才回复你的帖子
感谢你提供的答案
我是这么理解的,系统默认的应用程序打印(调用printf)是经控制台的,如果当前控制台被指定为串口,那么应用程序经串口打印;在系统进入文件系统,调用初始化的时候,会先找console节点,如果此节点存在,则将控制台指定为串口,这时,系统自动调用串口作为应用程序打印输出,此时串口在应用层被系统占用,即使在应用程序中用户再次打开串口,设定串口的raw模式,由于系统的优先级高于当前用户,而系统的打印非raw模式,使得用户经此串口传输的原始数据被翻译,自动转化掉非法字符,原始数据因而被改变。
但是如果在制作根文件系统的时候,没有手动添加console节点,在进入文件系统后,调用初始化的时候,就会找不到,因此会报出Warning: unable to open an initial console.此时系统无法将控制台指定为串口(因为找不到console),因此,串口在应用层就没有被系统调用,而此时调用printf函数就不会有输出,但这时,用户打开串口,设定串口raw模式,就会完整收发原始数据(用户在应用层独占串口);由于系统打印和内核打印(printk)不是指定控制台,而是直接指定串口,则在此情况下,系统打印和内核打印依然会有正确字符输出。

论坛徽章:
0
发表于 2011-08-26 08:58 |显示全部楼层
回复 6# zhongfrank


    init 进程也是可以重启的,一般情况下它在退出之后自动重启, 由 /etc/inittab 定义。  这样只要修改 配置文件 /etc/inittab ,如用脚本替换。就可以实现shell的标准输入和标准输出是否是串口。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP