Ⅰ linux下实现了双向串行通信,目前只能发送字符串,但如何实现:1.汉字的通信 如何实现 2.聊
1、串口有通信字节位数限制,所以中文最好用 base64 编码后发送,保证都是 7bit 编码。
2、聊天窗口看你水平了,图形界面函数库 GTK 或者 QT 自己选。字符界面用 ncurses ,不过在字符界面跑中文支持需要外挂程序,cce 或者 zhcon 都很老了,但没别的可选了。
3、中文输入图形界面现在都是统一的,图形界面你的系统能用中文就都能用。字符界面中文环境会模拟成一个新的字符终端。
4、编程时不要用中文直接写道源代码里。最好用外挂式,源代码里面最好只有 ASCII 字符。
5、Linux 系统内部统一用 UTF8 处理,你的程序在输出输入时,最好做一次当前系统编码和UTF8的互相转换。
6、当前 Linux 默认基本都是 UTF8 ,但不排除有其他想法的发行版使用别的编码。
Ⅱ 怎么提高linux下的串口通信效率
MASK ICANON位,选择RAW,跳过TTY线路规程。 如果你对MASK操作不熟悉,说明你C语言不是很纯熟,&与~的结合是屏蔽某几位的意思。
Ⅲ 如何在linux上使用串口设备
简单的运行 dmesg 命令
$ dmesg | grep tty
输出:
[ 37.531286] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 37.531841] 00:0b: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 37.532138] 0000:04:00.3: ttyS1 at I/O 0x1020 (irq = 18) is a 16550A
setserial 命令
setserial 是一个程序用于设定并/或报告某个串口关联的配置信息。该信息包括串口用到的I/O 端口和中断号,以及Break键是否应被解释为Secure Attention Key 等等。 仅仅是输出如下的命令:
$ setserial -g /dev/ttyS[0123]
输出:
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: 16550A, Port: 0x1020, IRQ: 18
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
带-g选项的setserial帮助找到你的Linux板子上的物理串口。
Linux 串口控制台程序
一旦串口被确定了,你就能使用许多的工具来配置Linux板子:
minicom- 用于控制modem和连接到mp 设备的最好的串口通信程序。
wvidial or other GUI dial up networking program - 一个内建智能PPP 拨号器。
getty / agetty - agetty 打开一个 tty 端口, 提示登录名称并调用 /bin/login 命令。
grub / lilo configuration - 配置串口为系统控制台。
Ⅳ 如何查看linux下串口是否可用串口名称等
1、查看串口是否可用,可以对串口发送数据比如对com1口,echo lyjie126 > /dev/ttyS0
2、查看串口名称使用 ls -l /dev/ttyS* 一般情况下串口的名称全部在dev下面,如果你没有外插串口卡的话默认是dev下的ttyS* ,一般ttyS0对应com1,ttyS1对应com2,当然也不一定是必然的;
3、查看串口驱动:cat /proc/tty/drivers/serial
4、查看串口设备:dmesg | grep ttyS*
(4)linux下的串口通信扩展阅读
接口划分标准
同步串行接口(英文:SynchronousSerialInterface,SSI)是一种常用的工业用通信接口。。
异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送。UART是一个并行输入成为串行输出的芯片,通常集成在主板上。UART包含TTL电平的串口和RS232电平的串口。 TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平,MDS2710、MDS SD4、EL805等是RS232接口,EL806有TTL接口。
串行接口按电气标准及协议来分包括RS-232-C、RS-422、RS485等。RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。
Ⅳ linux系统怎么串口通信
装个minicom吧,实现串口通信。
Ⅵ Linux下串口通信丢字节的问题是怎么样解决
int con=atoi(portstr);
unsigned char Port_file_name[30];
int fd0,rc;
struct termios ts0;
switch (con)
{ //选项O_NOCTTY 表示不能把本串口当成控制终端,否则用户的键盘输入信息将影响程序的执行
//O_NDELAY表示打开串口的时候,程序并不关心另一端的串口是否在使用中
case 1: fd0=open("/dev/ttyM0",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 2: fd0=open("/dev/ttyM1",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 3: fd0=open("/dev/ttyM2",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 4: fd0=open("/dev/ttyM3",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 5: fd0=open("/dev/ttyM4",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 6: fd0=open("/dev/ttyM5",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 7: fd0=open("/dev/ttyM6",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 8: fd0=open("/dev/ttyM7",O_RDWR | O_NOCTTY | O_NDELAY); break;
default : fd0=open("/dev/ttyM0",O_RDWR | O_NOCTTY | O_NDELAY); break;
}
tcgetattr(fd0,&ts0);
bzero(&ts0,sizeof(struct termios));
switch (gytype)
{
case 1:{ts0.c_cflag |= B300 | CS7 | CLOCAL | CREAD | PARENB ;
ts0.c_cflag &= ~PARODD; // 转换为偶效验
ts0.c_iflag |= INPCK; // Disnable parity checking
break; }
case 2:{ts0.c_cflag |= B1200 | CS8 | CLOCAL | CREAD | PARENB ;
ts0.c_cflag &= ~PARODD; // 转换为偶效验
ts0.c_iflag |= INPCK; // Disnable parity checking
break;
}
case 3:{
ts0.c_cflag |= B9600 | CS8 | CLOCAL | CREAD ;
ts0.c_cflag &= ~PARENB; // Clear parity enable
ts0.c_iflag &= ~INPCK; // Enable parity checking
break;
}
case 4:{ts0.c_cflag |= B9600 | CS8 | CLOCAL | CREAD | PARENB ;
ts0.c_cflag &= ~PARODD; // 转换为偶效验
ts0.c_iflag |= INPCK; // Disnable parity checking
break;
}
}
ts0.c_lflag &= ~ECHO;
ts0.c_lflag &= ~ECHONL;
ts0.c_iflag &= ~IXOFF;
ts0.c_iflag &= ~IXON;
ts0.c_cflag &= ~CSIZE;
switch (gytype)
{
case 1:{ts0.c_cflag |= CS7 ; break;}
case 2:{ts0.c_cflag |= CS8 ; break;}
case 3:{ts0.c_cflag |= CS8 ; break;}
case 4:{ts0.c_cflag |= CS8 ; break;}
}
ts0.c_lflag &= ~ICANON; //如果设置使能规范输入,否则使用原始数据(本文使用)
ts0.c_oflag &= ~ONLCR; //如果设置将NL转换成CR-NL后输出
ts0.c_iflag &= ~INLCR; //如果设置将接收到的NL(换行)转换成CR(回车)。
ts0.c_cc[VMIN] = 0; //最少可读数据
ts0.c_cc[VTIME] = 0; //等待数据时间(10秒的倍数)
ts0.c_cflag &= ~CSTOPB; //如果设置则使用两个停止位 ,如果取消则使用一个停止位
ts0.c_iflag |= IGNBRK; //如果设置则忽略接收到的break信号
ts0.c_lflag &= ~IEXTEN; //如果设置则启用实现自定义的输入处理
ts0.c_lflag |= NOFLSH; //如果设置则禁止产生SIGINT,SIGQUIT和SIGSUSP信号时刷新输入和输出队列
switch (gytype)
{
case 1:{rc = cfsetospeed(&ts0,B300);break; }
case 2:{rc = cfsetospeed(&ts0,B1200);break; }
case 3:{rc = cfsetospeed(&ts0,B9600);break; }
case 4:{rc = cfsetospeed(&ts0,B9600);break; }
}
rc = tcsetattr(fd0,TCSAFLUSH,&ts0);
return fd0;
Ⅶ linux串口通信代码解释,一句一句来
简单说几句吧,linux下的设备都是文件,流程也无非是open, read/write, close等
当然,串口你得设置各种属性才行对不对,比如在win下的超级终端就设置了波特率啊,停止位啊,奇偶校验啊什么的,这些属性都通过
int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);函数来设置。
完整代码吗自己去google,一把一把的,其实最重要的是设置好属性,剩下的就是read,write的问题咯。
希望对你有用
对了,了解终端函数的详情请在linux命令行终端获取: man termios
Ⅷ linux系统中串口如何通讯
这个难实现,试试iptables的转发思路能用吗?
转发TCP 8081到xx.xx.xx.xx:
#iptables -t nat -I PREROUTING -p tcp –dport 8081 -j DNAT –to xx.xx.xx.xx
Ⅸ linux串口通讯简单问题
这个write程序向串口(/dev/ttyS0)写入数据,由于这个文件取名与系统自带的write命令重名,因此执行时键入:
./write
再试试。
Ⅹ linux下串口通信问题
MASK ICANON位,选择RAW,跳过TTY线路规程。
如果你对MASK操作不熟悉,说明你C语言不是很纯熟,&与~的结合是屏蔽某几位的意思。