配置串口需要包含头文件
其中最核心的配置结构体为:
如何获取该结构呢?我们 *** 作串口跟 *** 作文件一样,也是调用 open() 函数来打开串口,
这样我们就能够得到一个文件描述符 fd ,然后就可以调用 tcgetattr() 函数来获取上述配置结构体了。
Linux 串口默认的配置为:波特率 9600,数据位 8 位,无奇偶校验,停止位 1 位,无 CTS/RTS 。
以下介绍一些常用的配置项:波特率、奇偶校验、数据位、停止位、硬件控制流。
相关接口:
Linux 将串口的波特率分为了输入波特率和输出波特率,不过最常用的场景是将两者设置成一样。
cfgetispeed() 函数获取输入波特率, cfgetospeed() 函数获取输出波特率。 cfsetispeed() 函数设置输入波特率, cfsetospeed() 函数用于设置输出波特率,当然 cfsetspeed() 函数扩展为同时设置输入和输出波特率。
上述接口中的 speed_t 是一系列波特率的标志位,例如常用的 115200 波特率就为 B115200,参考下述选项:
设置奇偶校验位可以通过修改 termios 结构体中的 c_cflag 成员来实现,若无校验,则将 PARENB 位设为 0;若有校验,则 PARENB 为 1。之后再根据 PARODD 来区分奇偶校验, PARODD 为 1 表示奇校验, PARODD 为 0 表示偶校验。例如设置无奇偶校验位:
设置数据位可以通过修改 termios 结构体中的 c_cflag 成员来实现,CS5、CS6、CS7 和 CS8 分别代表数据位 5、6、7 和 8。不过在设置数据位之前,需要先用 CSIZE 来做屏蔽字段,清楚这几个标志位,例如设置数据位为 8 位:
设置停止位可以通过修改 termios 结构体中的 c_cflag 成员来实现, CSTOPB 位为 1 表示 2 位停止位, CSTOPB 位为 0 标志 1 位停止位。例如设置停止位为 1 位:
设置硬件控制流可以通过修改 termios 结构体中的 c_cflag 成员来实现, CRTSCTS 为 1 表示使用硬件控制流,为 0 表示不使用硬件控制流。例如使能硬件控制流:
当然,最后还需要用 tcflush() 抛弃存储在 fd 里的未接收的数据。
再利用接口 tcsetattr() 函数将配置信息写入文件描述符 fd :
这样整个串口最常用的用法就配置完成了。
具体的配置使用可以参考我的项目 HCI-Middleware 里的 hci_transport_uart_linux.c 文件。
参考:
望能帮到你。由于公司产品要做行业市场,而产品与行业用户间PC的通讯为RS232串口方式。而行业用户那里的PC都没有串行口,而且行业用户PC *** 作系统为Turbo
Linux。怎么办?
办公室内有台机器是RedHat
Linux
9.0
一个是
Fedora
Core
5
。就先在这两个系统上试验吧。这两台电脑上各自本身就有2个RS232串口。
一、PCI转串口卡安装
型号NetMos
Nm9835CV
1、插入PCI卡到主机
2、启动
Linux,打开终端
3、输入命令:#setserial
/dev/ttyS0
-a
(COM-1)
显示内容:/dev/ttyS0,
Line
0,
UART:
16550A,
Port:
0x3f8,
irq:
4
Baud_base:
115200,
clos_delay:
50,
divisor:
0
closing_wait:
3000,
closing_wait2:
infinite
Flags:
spd_normal
skip_test
4、输入命令:#setserial
/dev/ttyS2
-a
(COM-3)
显示内容:/dev/ttyS2,
Line
2,
UART:
unknown,
Port:
0x3e8,
irq:
4
Baud_base:
115200,
clos_delay:
50,
divisor:
0
closing_wait:
3000,
closing_wait2:
infinite
Flags:
spd_normal
skip_test
第3、4步 *** 作的目的主要是对主机自带串口及PCI扩展串口的区别。区别在于4显示的内容中UART:未unknow。不过若您检测这一步的时候
UART为16550A而不是unknow,证明你的系统已经认识了扩展的串口,不需要进一步设置,直接跳入第8步测试就可以了。
5、需要输入命令查看一下您当前PCI检测的状态,以便对扩展串口进行设置
#more
/proc/pci
会显示出一堆的信息,不要因为看不懂而吓坏了。只要看到类似于这个PCI的信息,比如:PCI
communication。。。或者Board
with
Nm9835CV
part。。。
可能就是这个卡了,主要看看它的终端是多少,即irq多少及分配的地址是多少。例如:(不一定完全一样)
Board
with
Nm9835CV
part
irq:11
I/O
at
0xc000
[0xc001]
serial
port
1
I/O
at
0xc400
[0xc401]
serial
port
2
I/O
at
0xc800
[0xc801]
not
used
I/O
at
0xd000
[0xd001]
not
used
I/O
at
0xd400
[0xd401]
not
used
I/O
at
0xd800
[0xd801]
not
used
6、知道PCI扩展卡的终端为11
串口1地址为0xc000
串口2地址为0xc400..
就可以设置扩展的串口了。输入命令:
setserial
/dev/ttyS2
port
0xc000
UART
16550A
irq
11
Baud_base
115200
另一个串口也类似的这么 *** 作
7、设置完毕后,就可以看看设置的情况了,输入第2步的命令看看,UART是否就是16500A
而不是
unknow了,如果是16500A恭喜,可能设置好咯,如果不是那就再检查一下吧。
8、设置好了后是不是需要测试一下是否能够通讯呢?最好的办法是两台pc相连。如果pc为windows *** 作系统就用超级终端,是linux呢就用minicom吧
9、装有linux的机器,首先需要设置一下监听的串口参数,输入命令
#minicom
-s
进入界面后有个框d出来,如果你还认识点英文单词的话,就回知道选择哪个的。应该是第三个吧,串口设置。
将第一行更改为
/dev/ttyS2
波特率也更改您所需要的。
更改完后保存,保存的那个菜单应该是
save
...
df1
最后
exit
10、在另外一台机器发送数据,这台机器minicom界面就能够收到信息了,成功后觉得挺有意思。另外不要把两个COM顺序弄翻了,如果弄错了哪个是COM3
COM4测试可就不灵便咯。
是的,linux是linustovalds当时为了研究一个多用户多任务 *** 作系统,用c代码编写了一个很小的 *** 作系统内核,他把这个源码公布,大家都来修改它和发展它,最终发展成现在的linux *** 作系统.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)