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);