c++讀取串口數據,Linux下c編程設置串口屬性和讀寫串口操作說明總結

 2023-12-25 阅读 28 评论 0

摘要:在使用串口的時候要遵循以下的順序才能使用。 1、打開串口設備 2、設置串口的波特率,數據位,校驗位,停止位以及其它設置 3、寫數據 4、讀出數據 c++讀取串口數據?5、關閉串口。 在編寫Linux串口的C程序之前,需要包含以下頭文件: #include

在使用串口的時候要遵循以下的順序才能使用。

1、打開串口設備

2、設置串口的波特率,數據位,校驗位,停止位以及其它設置

3、寫數據

4、讀出數據

c++讀取串口數據?5、關閉串口。

在編寫Linux串口的C程序之前,需要包含以下頭文件:

#include <termios.h>

在Linux系統中,一切皆文件,所以串口設備也是一類文件,學習過Linux驅動程序的學員都知道,Linux有三類設備:字符設備,塊設備,網絡設備。那么串口設備屬于字符設備。
所以串口設備的命名一般為/dev/ttySn(n = 0、1、2…),如果該串口為USB轉串口,可能名稱為/dev/ttyUSBn(n = 0、1、2…),不同的平臺下串口的名稱是不同的,
且串口的名稱也是可以更改的。如何更改?在板卡對應的Linux驅動中更改。

在Linux下操作串口,那么也就是跟操作一個文件一樣,既然是文件,也就可以使用標準的文件操作API來操作。

1、打開串口

linux 內核模塊中讀寫串口。int fd;
fd = open("/dev/ttyS0", O_RDWR|O_NOCTTY);
if(fd<0){
perror(“open uart device error\n”);
}

2、關閉串口
close(fd);

fd為文件描述符。

如果不設置串口的波特率,數據位,停止位,校驗位的情況下,Linux下默認設置的屬性值為:

波特率:9600

數據位:8

mixly讀串口和寫串口、校驗位:n(表示無)

停止位:1

在不設置串口屬性值的情況下,也可以讀寫串口值。

3、讀、寫串口

使用read,write函數即可,例如:
len = write(fd, buf, sizeof(buf));
if (len < 0) {
printf(“write data error \n”);
}

len = read(fd, buf, sizeof(buf));
if (len < 0) {
printf(“read error \n”);
return -1;
}

串口接收字符串技巧?以下例程是往串口寫入一個數據,串口就會回復一個數據,也就是自發自收。

完整例程:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <asm/termios.h>

#define DEV_NAME “/dev/ttyS1”

int main (int argc, char *argv[])
{
int fd;
int len, i,ret;
char buf[] = “hello ZLG!”;

fd = open(DEV_NAME, O_RDWR | O_NOCTTY);
if(fd < 0) {
perror(DEV_NAME);
return -1;
}

python3的串口讀寫函數、len = write(fd, buf, sizeof(buf));
if (len < 0) {
printf(“write data error \n”);
}

len = read(fd, buf, sizeof(buf));
if (len < 0) {
printf(“read error \n”);
return -1;
}

printf("%s", buf);

return(0);
}

上面給出的例程是串口驅動的默認屬性值(9600,8n1,無流控),在實際產品開發過程中,還是會根據不同的應用場景來設置串口的屬性。操作串口屬性需要設置對應的標志,
在POSIX終端已經幫我們實現了若干結構體以及相應的標志位,我們只要熟練使用它即可,非常簡單。

最重要的struct termios 結構體

cmd讀寫串口?struct termio
{
unsigned short c_iflag; /* 輸入模式標志 /
unsigned short c_oflag; /
輸出模式標志 /
unsigned short c_cflag; /
控制模式標志*/
unsigned short c_lflag; /* local mode flags /
unsigned char c_line; /
line discipline /
unsigned char c_cc[NCC]; /
control characters */
};

1、設置串口波特率

struct termios opt;

if (tcgetattr(fd, &opt)< 0) {

return ERROR;

}

串口命令。cfsetispeed(&opt, B9600); /設置為9600bps/

cfsetospeed(&opt, B9600);

if (tcsetattr(fd, TCSANOW, &opt)<0) {

return ERROR;

}

或者按以下用法:

R485串口編程?struct termios opt;

tcgetattr(fd, &opt);
cfsetispeed(&opt,B19200); /設置為19200bps/
cfsetospeed(&opt,B19200);
tcsetattr(fd,TCANOW,&opt);

一般來說,輸入、輸出的波特率應該是一致的。

2、設置數據位

設置數據位不需要專用的函數,只需要在設置數據位之前用數據位屏蔽標志(CSIZE)把對應數據位清零,然后再設置新的數據位即可,如下所示:

options.c_cflag &= ~CSIZE;/* 先把數據位清零*/

串口讀寫程序,options.c_cflag |= CS8;/* 把數據位設置為8位*/

3、設置校驗位

正如設置數據位一樣,設置奇偶校驗是在直接在cflag成員上設置。下面是各種類型的校驗設置方法。

1)無奇偶校驗(8N1):

options.c_cflag &= ~PARENB;

options.c_cflag &= ~CSTOPB;

web讀寫串口。options.c_cflag &= ~CSIZE;

options.c_cflag |= CS8;

2)7位數據位奇偶校驗(7E1):

options.c_cflag |= PARENB;

options.c_cflag &= ~PARODD;

options.c_cflag &= ~CSTOPB;

options.c_cflag &= ~CSIZE;

options.c_cflag |= CS7;

3)奇校驗(7O1):

options.c_cflag|= PARENB;

options.c_cflag |= PARODD;

options.c_cflag &= ~CSTOPB;

options.c_cflag &= ~CSIZE;

options.c_cflag |= CS7;

4、設置停止位

通過激活c_cflag中的CSTOPB而實現的。若停止位為1,則清除CSTOPB,若停止位為0,則激活CSTOPB。下面是停止位為1時的代碼(CSTOPB表示2個停止位(清除該標志表示1個停止位):

options.c_cflag &= ~CSTOPB;

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/194846.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息