ch340x驅動移植主要概念
移植指的是將廠商提供的驅動源碼調整適配到特定的系統版本。Linux系統通常會提供這些驅動的源代碼。
ch340簡介
這是一種用於USB轉串口的晶元,需要編寫驅動程序。
實驗目的
在Linux平台上熟悉驅動移植、編譯和載入的方法,實現官方ch34x驅動的USB轉串口功能。
硬體電路
開發板和一個CH340模塊。
驅動源碼下載
從blog.csdn.net/JAZZSOLDI...下載Linux驅動CH341SER_LINUX.ZIP,包含ch34x.c(驅動源碼)、Makefile(編譯文件)和readme.txt(版本和命令說明)。
代碼修改
主要修改ch34x.c的兩處代碼,注釋某些代碼,同時自定義Makefile。
編譯運行
使用make命令編譯,生成ch34x.ko的目標文件。使用make install將目標文件拷貝到NFS目錄。插入CH340模塊後,使用insmod命令載入ch34x驅動。
實驗現象
載入驅動後,系統立即識別出新的串口,證明移植成功。
總結
完成驅動的移植後,驗證了USB轉串口功能的實現,驗證了驅動在特定系統環境下的兼容性與可用性。
❷ 如何實現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 RS485串口編程
對於編程來說,沒什麼區別,通過控制485的使能端該程序完全可以使用。唯一的區別就是你在發送的時候通過程序把485的控制腳拉高,接收的時候把他拉低就可以了。至於電氣方面的區別:RS232是全雙工,可以同時收發,RS485是半雙工,不能同時收發,還有電平信號不一樣,這個編程你就不要理了。
❹ 很簡單的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發出數據後需要等待
一段時間才能接收到板子 返回的數據。 具體時間測試來看。
❺ Linux c串口編程中什麼是奇偶效驗
奇偶校驗是一種校驗代碼傳輸正確性的方法。根據被傳輸的一組二進制代碼的數位中「1」的個數是奇數或偶數來進行校驗。採用奇數的稱為奇校驗,反之,稱為偶校驗。採用何種校驗是事先規定好的。通常專門設置一個奇偶校驗位,用它使這組代碼中「1」的個數為奇數或偶數。若用奇校驗,則當接收端收到這組代碼時,校驗「1」的個數是否為奇數,從而確定傳輸代碼的正確性。