linux下串口編程
❶ 如何在linux下編寫一個C語言的串口程序
1、參考這個:POSIX操作系統串口編程指南和 UNIX環境高級編程。
2、簡單介紹一下:
《POSIX操作系統的串口編程指南》是在UNIX環境或PC上對串口進行編程的教程,每一章提供的常式都使用POSIX(Portable Standard for UNIX)終端控制函數,只需極少的修改就可運行在IRIX 、HP-UX、 SunOS、 Solaris、 Digital UNIX、 Linux等大多數類UNIX操作系統。
❷ Linux RS485串口編程
對於編程來說,沒什麼區別,通過控制485的使能端該程序完全可以使用。唯一的區別就是你在發送的時候通過程序把485的控制腳拉高,接收的時候把他拉低就可以了。至於電氣方面的區別:RS232是全雙工,可以同時收發,RS485是半雙工,不能同時收發,還有電平信號不一樣,這個編程你就不要理了。
❸ linux串口編程(termios)相關的使用問題
你好樓主,前一陣正好研究了一下linux串口編程,苦惱了一陣,不過總算弄通了,下面說一下我的思路和理解。
struct termios state; 這是一個設計到串口屬性的結構體,通過給結構體內的屬性賦值來設計串口
的一些屬性。
tcgetattr (STDIN_FILENO, &state); 這是獲取當前的串口的屬性,並賦給STDIN_FILENO這個設
備。計算機中已定義STDIN_FILENO這是一個標准輸入的設
備,通常是寫在屏幕上(就是在屏幕上顯示)。如樓主所說
的A與B相連,可能就是從A寫到B了。
=====下面是重新給串口的結構體的屬性賦值,以達到自己想設計一個什麼功能的串口========
state.c_iflag &= ~(ICRNL | INPCK | ISTRIP | BRKINT); c_iflag是控制輸入屬性的標志位,打個比
方,c_iflag原來是111,ICRNL代表001 ,ICRNL代表010,ISTRIP代表100,這三
個常量按位或ICRNL | INPCK | ISTRIP 得出的結果就是111 然後再取 ~(非)符號
得的結果就是 000。就代表最終c_iflag的值是000。然後計算機就會根據這一竄二
進制的數字來判斷輸入的到底是什麼屬性。向ICRNL 這些常量的值都是在計算機
中已經定義好的了。但是字元串的位數要比我舉例子的要多,我只是說了個大概的
意思。 下面我說一下上面個參數的意思。
ICRNL 代表將輸入中的回車換為新行。
INPCK 代表啟用奇偶校驗。
ISTRIP 代表去掉第八位,(就是傳輸是只傳7位)
BRKINT 代表 如果設置了IGNBRK,將忽略BREAK。如果沒有設置,但是設置了
BRKINT,那麼BREAK將使得輸入和輸出隊列被刷新(影響應該不大)
state.c_iflag |= IXON; IXON 表示可以用ctrl-s暫停輸出 。
state.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO);
c_lflag 代表本地屬性(local),原理同上,下面介紹下個參數的用意。
ICANON代表允許一些特殊字元以及按行緩沖。
IEXTEN 當設置 時可被識別,不再作為輸入傳遞。
ISIG 代表當接收到INTR QUIT SUSR 或 DSUSP時產生信號。
ECHO 顯示輸入字元。
state.c_oflag &= ~OPOST; c_oflag 代表輸出控制標志位。
OPOST 代表程序可以選擇加工過的輸入
state.c_cflag |= CS8; c_cflag 代表控制標志位(ctrl)
CS8代表字元長度掩碼是8為,(如會看到串口一些數據
「 9600 -8-n-1」 代表頻率9600,字元長度8位,無奇偶校驗,一
位停止位)。
state.c_cflag |= CREAD; CREAD代表設置接受使能。
state.c_cc[VMIN] = 1; 代表非常規模式下讀的最小的字元數。
state.c_cc[VTIME] = 0; 代表非常規模式下讀的最小延遲。
==========================================================================
tcsetattr (STDIN_FILENO, TCSAFLUSH, &state); 這是把剛才設置好的屬性又賦值給
STDIN_FILENO這個設備。
TCSAFLUSH代表當清空輸入輸出緩沖區時
才改變。
以上是我的看法,希望這些對你有幫助, 歡迎有問題與我交流。
❹ 如何實現linux下的串口中斷編程
#include
#include
#include
#include
#include
#include
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX 系統相容 */
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO (int status); /* 定義訊號處理程序 */
int wait_flag=TRUE; /* 沒收到訊號的話就會是 TRUE */
main()
{
int fd,c, res;
struct termios oldtio,newtio;
struct sigaction saio; /* definition of signal action */
char buf[255];
/* 開啟裝置為 non-blocking (讀取功能會馬上結束返回) */
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) {perror(MODEMDEVICE); exit(-1); }
/* 在使裝置非同步化前, 安裝訊號處理程序 */
saio.sa_handler = signal_handler_IO;
saio.sa_mask = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
/* 允許行程去接收 SIGIO 訊號*/
fcntl(fd, F_SETOWN, getpid());
/* 使檔案ake the file descriptor 非同步 (使用手冊上說只有 O_APPEND 及
O_NONBLOCK, 而 F_SETFL 也可以用...) */
fcntl(fd, F_SETFL, FASYNC);
tcgetattr(fd,&oldtio); /* 儲存目前的序列埠設定值 */
/* 設定新的序列埠為標准輸入程序 */
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
/* 等待輸入訊號的迴圈. 很多有用的事我們將在這做 */
while (STOP==FALSE) {
printf(".\n");usleep(100000);
/* 在收到 SIGIO 後, wait_flag = FALSE, 輸入訊號存在則可以被讀取 */
if (wait_flag==FALSE) {
res = read(fd,buf,255);
buf[res]=0;
printf(":%s:%d\n", buf, res);
if (res==1) STOP=TRUE; /* 如果只輸入 CR 則停止迴圈 */
wait_flag = TRUE; /* 等待新的輸入訊號 */
}
}
/* 回存舊的序列埠設定值 */
tcsetattr(fd,TCSANOW,&oldtio);
}
❺ linux文件編程和串口編程的基本概念是什麼
簡單說幾句吧,linux下的設備都是文件,流程也無非是open, read/write, close等當然,串口你得設置各種屬性才行對不對,比如在win下的超級終端就設置了波特率啊,停止位啊,奇偶校驗啊什麼的,這些屬性都通過 int tcgetattr(int fd, struct termios *termios_p); int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);函數來設置。完整代碼嗎自己去google,一把一把的,其實最重要的是設置好屬性,剩下的就是read,write的問題咯。希望對你有用對了,了解終端函數的詳情請在linux命令行終端獲取: man termios
❻ linux下C語言串口編程,用xgcom串口調試助手調試不通
同意 1 樓的
連接一個硬體線路
甚至可以簡單的 一端 linux,另一端 win xp之類的系統
因為win 下的串口工具很多
❼ 很簡單的linux串口編程問題:fd = open("/dev/ttysn",|XXXXXXX)。其中哪個ttysn具體是多少
沒做過linux下的,提供個建議,看成不成。
PC端的串口必須配置正確。 要確定 與 板子的 波特率 要一致。
此外, PC端作為串口總控端, COM埠配置只針對於PC端自己。 比如你使用了COM1口,那麼定義的時候,(ttysn 應該是 ttysn1 --- 沒用過linux下的不知道是不是在這配置,你要查)
板子端的COM口配置也是只針對於自己,如果你使用板子的COM1和COM2, 那麼程序中初始化的時候需要同時把COM1/2都初始化,那麼PC端就可以連接任意的板子埠。
PC(COM1) ---- 板子(COM1) 或 PC(COM1) ---- 板子(COM2)
在確保板子硬體沒有問題的情況下,且PC端程序無誤, 如果PC端無法接收到數據, 嘗試
在PC端編寫程序時,在 接收數據之前 加上時間延遲。 也就是說,PC發出數據後需要等待
一段時間才能接收到板子 返回的數據。 具體時間測試來看。