忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 11870 | 回复: 11

请问:如何在arm中自由切换调试串口成为普通串口 [复制链接]

论坛徽章:
0
发表于 2009-03-03 17:03 |显示全部楼层
由于任务的需要,以及串口的限制,想动态的切换调试串口成为普通串口,并且切换回来,网上看了一个用ioctl的,但是不是很成功,大家又没有好的办法(或者思路)?谢谢

论坛徽章:
4
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:28
发表于 2009-03-03 17:13 |显示全部楼层
楼主想做什么?
能否用gpio模拟一个呢?

论坛徽章:
0
发表于 2009-03-03 19:44 |显示全部楼层
GPIO全部用完了,我这个是一个比较庞大的系统,使用了PCI总线和3个芯片协作,因此资源消耗很大了!

论坛徽章:
0
发表于 2009-03-03 19:45 |显示全部楼层
我用了一下setconsole命令,结果我的调试串口不知道被我搞到哪里去了

论坛徽章:
0
发表于 2009-03-03 22:55 |显示全部楼层
建议楼主看一下LDD关于调试那章,说了可以进行输出重定向。
好像是通过ioctl 的命令,具体文档好想是/driver/char/tty

论坛徽章:
0
发表于 2009-03-04 09:33 |显示全部楼层
我在shell中使用了他说的那个setconsole命令,但是也许是我使用的不对,总是不行,或者控制台不知道被我定位到什么地方了!
Usage: setconsole [-r|--reset] [DEVICE]
这个是他提示的做法!根据这个试验了很久,但是总是不成功阿

论坛徽章:
0
发表于 2009-03-04 17:01 |显示全部楼层
和我们的需求一样,我们是如果用户想把串口作为console的话,那么在系统启动的时候,输入回车来开启console,否则就作为普通的串口用。

1,  在内核驱动里,不要将串口初始化为console, 如我的:
uclinux-l200v40/linux-2.4.x/drivers/char/tty_io.c
// #ifdef CONFIG_SERIAL_WINBOND_CONSOLE
#if 0
        winbond_console_init();
#endif
或者在make menuconfig的时候配置,不要将ttyS0设置为console;

2, 在内核启动,进入busybox时,在/etc/inittab中不要设置串口登录:
# Activate watchdog and logging
#ttyS0::respawn:/sbin/getty -L ttyS0 115200 linux

3, 设置启动脚本/etc/init.d/S02Cmd.sh
#!/bin/sh

/usr/sbin/cmd -D 3
exit 0

其中/usr/sbin/cmd为我们从串口接收数据的C程序,这个程序在启动时监听串口,在1s内,如用户按了回车键,那么就作console,这个可以使用下面的方法来实现; 否则就做普通串口用了。

在cmd这个程序中,如果接收到回车键,可以使用system()执行脚本:/usr/sbin/cmd_getty.sh 来重新启用console,内容如下:
#!/bin/sh
/sbin/getty -L ttyS0 115200 linux &
exit 0

如果使用ssh登录上去,想开启console,也可以直接使用下面命令来开启:
/sbin/getty -L ttyS0 115200 linux &

如果有更好的方法,可以交流!

论坛徽章:
0
发表于 2009-03-05 13:57 |显示全部楼层
谢谢,dglwx,我从网上学习了一个方法。目前串口和终端都可以同时收到到数据,同时在终端中如果输入CTRL+C程序可以推出,哈哈,很好玩!

void CloseConsole(void)
{
int fp,err;
unsigned char buff[20];
unsigned char send_buff[20];
struct termios options;
printf("change1\n";
fp = open("/dev/console",O_RDONLY); // 改变console
ioctl(fp,TIOCCONS);
close(fp);


fp = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY|O_NONBLOCK); //打开串口0读写
if(fp == -1) exit(0);
tcgetattr(fp,&options);
cfsetispeed(&options,B115200);
cfsetospeed(&options,B115200);
options.c_cflag |= (CLOCAL|CREAD);
tcsetattr(fp,TCSANOW,&options);
    write(fp,"hello world!\n12",15);

while(1)
{
sleep(11);

while(err=ReadComPort(fp,buff,20)/*read(fp,buff,1)*/>0)
{
        WriteComPort(fp, send_buff, ;
  }
}
close(fp);                       //关闭串口0

fp = open("/dev/console",O_RDONLY);  //恢复console 到串口0
ioctl(fp,TIOCCONS);
close(fp);
printf("change2\n";
}

论坛徽章:
0
发表于 2009-10-12 09:31 |显示全部楼层
请问能否使调试信息不在普通串口中输出

论坛徽章:
0
发表于 2012-10-31 11:13 |显示全部楼层
朋友,你好,现在我做的项目也需要这个功能,能不能给我分享一下怎么做呢?谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP