如何在linux上使用串口设备

如何在linux上使用串口设备,第1张

简单的运行 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和连接到dump 设备的最好的串口通信程序。

wvidial or other GUI dial up networking program - 一个内建智能PPP 拨号器。

getty / agetty - agetty 打开一个 tty 端口, 提示登录名称并调用 /bin/login 命令。

grub / lilo configuration - 配置串口为系统控制台。

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/6063674.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-13
下一篇 2023-03-13

发表评论

登录后才能评论

评论列表(0条)

保存