導航:首頁 > 操作系統 > linux串口程序c

linux串口程序c

發布時間:2023-05-28 05:21:48

1. C語言串口設置問題:linux下怎麼用C語言設置串口通訊的MARK, SPACE校驗

struct termios opt;

memset(&opt, 0, sizeof(opt));
cfmakeraw (&opt);
opt.c_cflag |= CLOCAL | CREAD | CS8; //8bit
opt.c_cflag &= ~(PARENB | CSTOPB); //no parity check,no stop bit
opt.c_cc[VMIN] = 1;
opt.c_cc[VTIME] = 0; /*read waite for x*0.1s*/
更多知識看看unix環境高級編程-終端編程哪一章,或網路linux串口編程。

2. Linux C 配置串口

配置串口需要包含頭文件

其中最核心的配置結構體為:

如何獲取該結構呢?我們操作串口跟操作文件一樣,也是調用 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 文件。

參考:

3. 如何在LINUX下編寫一個C語言的串口程序

1、參考這個:POSIX操作系統串口編程指南和 UNIX環境高級編程。
2、簡單介紹一下:
《POSIX操作系統的串口編程指南》是在UNIX環境或PC上對串口進行編程的教程,每一章提供的常式都使用POSIX(Portable Standard for UNIX)終端控制函數,只需極少的修改就可運行在IRIX 、HP-UX、 SunOS、 Solaris、 Digital UNIX、 Linux等大多數類UNIX操作系統。

4. Linux 用C寫串口(modem)(急!)

是的,linux是linus
tovalds當時為了研究一個多用戶多任務操作系統,用c代碼編寫了一個很小的操作系統內核,他把這個源碼公布,大家都來修改它和發展它,最終發展成現在的linux操作系統.

5. 怎樣用C/C++在Linux系統實現串口通訊

Linux下面有設備文件
串口裝好驅動後 會顯示在dev下
然後對這個設備文件進行讀寫即可。
比windows要簡單的多。

6. 關於怎樣在linux上用C寫串口收發數據程序

對於編程來說,沒什麼區別,通過控制485的使能端該程序完全可以使用。唯一的區別就是你在發送的時候通過程序把485的控制腳拉高,接收的時候把他拉低就可以了。至於電氣方面的區別:RS232是全雙工,可以同時收發,RS485是半雙工,不能同時收發,還有電平信號不一樣,這個編程你就不要理了。

7. LINUX和開發版 串口程序編寫問題

分類: 電腦/網路 >> 程序設計 >> 其他編程語言
問題描述:

速度徵求答案 正確追加100分 2小時之內 謝謝

#include <termios.h>

#include <stdio.h>

#include <unistd.h>

#include <ftl.h>

#include <pthread.h>

#define BAUDRATE B115200

#define 1 "/dev/ttyS0"

#define 2 "/dev/ttyS1"

#define ENDMINITERM 27

#define FALSE 0

#define TRUE 1

volatile int STOP=FALSE;

volatile int fd;

void* keyboard(void * data)

{

int c;

for (;;){

c=getchar();

if( c== ENDMINITERM){

STOP=TRUE;

break ;

}

}

return NULL;

}

void* receive(void * data)

{

int c;

printf("read modem\n");

while (STOP==FALSE)

{

在此處補充填寫代碼?實現讀取串口數據、並將數據在標准終端上寫出來

}

printf("exit from reading modem\n");

return NULL;

}

void* send(void * data)

{

int c='0';

printf("send data\n");

while (STOP==FALSE)

{

c++;

c %= 255;

在此處補充填寫代碼?實現寫入串口數據

usleep(1000000);

}

printf("exit from send modem\n");

return NULL;

}

int main(int argc,char** argv)

{

struct termios oldtio,newtio;

pthread_t th_a, th_b, th_c;

在此處補充填寫代碼?實現打開串口1的功能

if (fd <0) {

perror(1);

exit(-1);

}

tcgetattr(fd,&oldtio);

newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;/*ctrol flag*/

newtio.c_iflag = IGNPAR;

newtio.c_oflag = 0;

newtio.c_lflag = 0;

newtio.c_cc[VMIN]=1;

newtio.c_cc[VTIME]=0;

tcflush(fd, TCIFLUSH);

tcsetattr(fd,TCSANOW,&newtio);

在此處補充填寫代碼?實現創建鍵盤監控、接收、發送三個線程,並等神扒待線程結束

tcsetattr(fd,TCSANOW,&oldtio); /*恢復串口設置*/

在此處補充填寫代碼?實現關閉串口功能

exit(0);

}

解析:

while (STOP==FALSE)

{

在此處補充填寫代碼?實現讀取串口數據、並將數據在標准終端上寫出來

if(read(fd, data, ENDMINITERM)==0)

return data;

}

while (STOP==FALSE)

{

c++;

c %= 255;

在此處補充填寫代碼?實現寫入渣瞎氏串口數據

if(write(fd, data, ENDMINITERM) < 0)

exit(1);

usleep(1000000);

}

在此處補充填寫代碼?實現打開串口1的功能

fd = open(1,O_RDWR);

if(fd < 0)

exit(1);

在此處補充填寫代碼?實現創建鍵盤監控如散、接收、發送三個線程,並等待線程結束 th_a, th_b, th_c;

if(pthread_create (&th_a, 0, keyboard, 0) != 0)

exit(1);

pthread_join(th_a,NULL);

if(pthread_create (&th_b, 0, receive, 0) != 0)

exit(1);

pthread_join(th_b,NULL);

if(pthread_create (&th_c, 0, send, 0) != 0)

exit(1);

pthread_join(th_c,NULL);

在此處補充填寫代碼?實現關閉串口功能

close(fd);

閱讀全文

與linux串口程序c相關的資料

熱點內容
陽光車險的app叫什麼名字 瀏覽:461
購買單片機的器件時需要給商家啥 瀏覽:534
並行編譯技術的發展 瀏覽:547
阿里雲伺服器安裝管理 瀏覽:548
java手機開發教程 瀏覽:672
我的世界怎麼刪除伺服器數據 瀏覽:669
linux內存子系統 瀏覽:971
加密思維幣 瀏覽:690
魅族訪客文件夾 瀏覽:52
添加的文件夾怎麼找 瀏覽:617
程序員涉黃 瀏覽:700
maven編譯resources下的js 瀏覽:521
ubuntu文件移動命令 瀏覽:229
安卓i怎麼查找蘋果手機 瀏覽:951
雲伺服器宕機概率 瀏覽:232
在線買葯用什麼app知乎 瀏覽:815
ubuntu解壓xz文件 瀏覽:676
宏傑加密時電腦關機 瀏覽:390
自己寫單片機編譯器 瀏覽:600
單片機按鍵閃爍 瀏覽:382