Linux C 配置串口

Linux C 配置串口,第1张

配置串口需要包含头文件

其中最核心的配置结构体为:

如何获取该结构呢?我们 *** 作串口跟 *** 作文件一样,也是调用 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是linus

tovalds当时为了研究一个多用户多任务 *** 作系统,用c代码编写了一个很小的 *** 作系统内核,他把这个源码公布,大家都来修改它和发展它,最终发展成现在的linux *** 作系统.


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

原文地址: http://outofmemory.cn/yw/8301188.html

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

发表评论

登录后才能评论

评论列表(0条)

保存