新聞中心
Linux下串口read函數(shù)的使用詳解

目前創(chuàng)新互聯(lián)已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、良慶網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
隨著嵌入式系統(tǒng)的快速發(fā)展,使用串口通信的需求越來越多。Linux作為一種廣泛使用的嵌入式系統(tǒng),已經(jīng)成為了許多嵌入式開發(fā)者的首選平臺(tái)。而在Linux系統(tǒng)中,串口通信的操作則往往需要使用到read函數(shù)。本文將從以下幾個(gè)方面詳細(xì)介紹Linux下串口read函數(shù)的使用:
一、串口通信的基礎(chǔ)
在進(jìn)行Linux下串口通信之前,我們需要先了解一些基礎(chǔ)知識(shí):
串口通信是指利用串行通信接口,通過發(fā)送和接收數(shù)據(jù)來實(shí)現(xiàn)兩個(gè)通信設(shè)備之間的數(shù)據(jù)交換。在串口通信中,數(shù)據(jù)是一個(gè)字節(jié)一個(gè)字節(jié)的發(fā)送和接收的,而且在發(fā)送和接收之間還需要有一個(gè)時(shí)間差,這就是串口通信的基本原理。
在Linux系統(tǒng)中,串口設(shè)備文件通常被命名為/dev/tty*,例如/dev/ttyS0表示COM1。通過打開串口設(shè)備文件,就可以進(jìn)行串口通信。
二、串口通信的設(shè)置
為了對串口進(jìn)行正確的操作,首先需要對串口進(jìn)行正確的設(shè)置。
在Linux系統(tǒng)中,我們可以使用stty命令對串口進(jìn)行設(shè)置。例如,要將串口波特率設(shè)置為115200,并設(shè)置數(shù)據(jù)位為8位、停止位為1、無校驗(yàn)位,則可以使用以下命令:
“`
stty -F /dev/ttyS0 115200 cs8 -cstopb -parenb
“`
也可以使用C語言編寫程序?qū)崿F(xiàn)串口設(shè)置的功能。下面是一個(gè)例子:
“`
#include
#include
#include
int open_port(void)
{
int fd;
fd = open(“/dev/ttyS0”, O_RDWR | O_NOCTTY | O_NDELAY);
if(fd == -1)
{
perror(“open_port: Unable to open /dev/ttyS0 – “);
}
else
{
fcntl(fd, F_SETFL,0);
}
return fd;
}
void set_port(void)
{
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
options.c_cflag |= CLOCAL | CREAD;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~PARENB;
tcsetattr(fd, TCSANOW, &options);
}
“`
以上是操作串口需要使用的主要命令和程序。
三、Linux下串口read函數(shù)的使用
在Linux系統(tǒng)中,我們可以使用read函數(shù)從串口讀取數(shù)據(jù)。read函數(shù)的頭文件為unistd.h,其定義為:
“`
ssize_t read(int fd, void *buf, size_t count);
“`
其中fd為串口設(shè)備文件的文件描述符,buf為數(shù)據(jù)接收緩沖區(qū)的地址,count為要讀取的字節(jié)數(shù)。函數(shù)返回值為實(shí)際讀取的字節(jié)數(shù)。
read函數(shù)的調(diào)用方式為:
“`
read(fd, read_buf, sizeof(read_buf));
“`
其中read_buf就是數(shù)據(jù)接收緩沖區(qū)。
需要注意的是,在使用read函數(shù)讀取數(shù)據(jù)前,需要先對串口進(jìn)行設(shè)置,并打開串口設(shè)備文件。
四、實(shí)例分析
下面通過一個(gè)實(shí)例來詳細(xì)介紹Linux下串口read函數(shù)的使用。
實(shí)例一:
在這個(gè)實(shí)例中,我們使用一個(gè)C語言程序從串口讀取數(shù)據(jù),并將讀取到的數(shù)據(jù)在終端上顯示出來。
實(shí)例代碼如下:
“`
#include
#include
#include
#include
#include
#define SERIAL_DEV “/dev/ttyS0”
#define BAUD_RATE B115200
int mn(void)
{
int serial_fd;
struct termios options;
serial_fd = open(SERIAL_DEV, O_RDWR | O_NOCTTY | O_NDELAY);
if(serial_fd == -1)
{
printf(“Can’t open serial port\n”);
return -1;
}
tcgetattr(serial_fd, &options);
cfmakeraw(&options);
cfsetispeed(&options, BAUD_RATE);
cfsetospeed(&options, BAUD_RATE);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~PARENB;
options.c_cc[VTIME] = 10;
options.c_cc[VMIN] = 0;
tcsetattr(serial_fd, TCSANOW, &options);
char read_buf[128];
while(1)
{
int read_cnt = read(serial_fd, read_buf, sizeof(read_buf));
if(read_cnt
{
continue;
}
read_buf[read_cnt] = ‘\0’;
printf(“Read %d bytes: %s”, read_cnt, read_buf);
}
close(serial_fd);
return 0;
}
“`
以上程序打開了/dev/ttyS0設(shè)備文件,并對設(shè)備進(jìn)行了正確的設(shè)置。接著在一個(gè)while循環(huán)中使用read函數(shù)從串口不停地讀取數(shù)據(jù),并在終端上顯示出來。需要注意的是,由于串口通信的延遲,函數(shù)超時(shí)時(shí)間需要設(shè)置為十秒。
實(shí)例二:
在這個(gè)實(shí)例中,我們使用一個(gè)C語言程序?qū)?shù)據(jù)通過串口發(fā)送出去。
實(shí)例代碼如下:
“`
#include
#include
#include
#include
#include
#define SERIAL_DEV “/dev/ttyS0”
#define BAUD_RATE B115200
int mn(void)
{
int serial_fd;
struct termios options;
serial_fd = open(SERIAL_DEV, O_RDWR | O_NOCTTY | O_NDELAY);
if(serial_fd == -1)
{
printf(“Can’t open serial port\n”);
return -1;
}
tcgetattr(serial_fd, &options);
cfmakeraw(&options);
cfsetispeed(&options, BAUD_RATE);
cfsetospeed(&options, BAUD_RATE);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~PARENB;
options.c_cc[VTIME] = 10;
options.c_cc[VMIN] = 0;
tcsetattr(serial_fd, TCSANOW, &options);
char *write_buf = “Hello, I’m a serial device.\n”;
int write_cnt = strlen(write_buf);
int write_ret = write(serial_fd, write_buf, write_cnt);
printf(“Write message to serial device.\n”);
close(serial_fd);
return 0;
}
“`
以上程序打開了/dev/ttyS0設(shè)備文件,并對設(shè)備進(jìn)行了正確的設(shè)置。接著將需要發(fā)送的數(shù)據(jù)通過write函數(shù)發(fā)送出去。需要注意的是,在使用write函數(shù)發(fā)送數(shù)據(jù)前,需要先對串口進(jìn)行設(shè)置,并打開串口設(shè)備文件。
五、
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
linux對串口write成功,但是read失敗
你不是只讀打開的吧?
你連線有問題嗎
感覺你好像是在同一臺(tái)設(shè)備上用讀和寫,正確的做法是,用串口線連接兩個(gè)設(shè)備,一個(gè)設(shè)備讀,另一個(gè)設(shè)備寫,可以用串口調(diào)試助手配合調(diào)試
串口是雙向通信,寫出的數(shù)據(jù)不能直接讀出;讀數(shù)據(jù)由另一個(gè)終端發(fā)出,可以短接2PIN與IN測試。
linux串口通信代碼解釋,一句一句來
簡單說幾句吧,linux下的設(shè)備都是文件,流程也無非是open, read/write, close等
當(dāng)然,串口你得設(shè)置各種屬性才行對不對,比如在win下的超級終端就設(shè)置了波特率啊,停止位啊,奇偶校驗(yàn)啊什么的,這些屬性都通過
int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);函數(shù)來設(shè)置。
完整代碼嗎自己去google,一把一把的,其實(shí)最重要的是設(shè)置好屬性,剩下的就是read,write的問題咯。
希望對你有用
對了,了解終端函數(shù)的詳情請?jiān)趌inux命令行終端獲?。?man termios
關(guān)于linux 串口 read的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
四川成都云服務(wù)器租用托管【創(chuàng)新互聯(lián)】提供各地服務(wù)器租用,電信服務(wù)器托管、移動(dòng)服務(wù)器托管、聯(lián)通服務(wù)器托管,云服務(wù)器虛擬主機(jī)租用。成都機(jī)房托管咨詢:13518219792
創(chuàng)新互聯(lián)(www.cdcxhl.com)擁有10多年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)、開啟建站+互聯(lián)網(wǎng)銷售服務(wù),與企業(yè)客戶共同成長,共創(chuàng)價(jià)值。
當(dāng)前名稱:「詳解Linux下串口read函數(shù)的使用」(linux串口read)
本文路徑:http://m.fisionsoft.com.cn/article/coeeisc.html


咨詢
建站咨詢
