OK6410 A開發板串列埠程式設計總結

2021-09-07 23:50:58 字數 3226 閱讀 5576

在linux下裝置操作跟檔案操作是相似的,基本步驟無非就是開啟,讀寫,關閉。首先包含上基本的標頭檔案:

#include #include #include
先來看開啟串列埠;

int open_port(int comport)

else

}if (comport==1)

else

}printf("fd-open=%d\n",fd);

return fd;

}

open函式第乙個變數對應的是裝置節點,這個是跟驅動相關的,ok6410-a板的串列埠被識別為/dev/ttysacx(x為0~3)。如果是其他的嵌入式linux系統,也可能是/dev/ttyusb0,一定要寫正確。

開啟成功後就可以進行傳送了:

write(fd, "hello", 5);
這裡的fd就是剛才開啟時返回的fd,hello長度為5,所以傳送5個位元組,是不是很簡單啊。同樣接收也簡單:

unsigned char recv_buf[1024];

int nread = read(fd, recv_buf, 5);

這裡的5表示要讀取5個位元組,而返回的nread是實際讀取到的位元組數。如果不知道該讀取多少個位元組怎麼辦呢?最簡單的迴圈讀取吧:

unsigned char temp;

while(1)

這樣乙個個位元組迴圈讀取,直到接收到我們需要的位元組,或者超時什麼的,跳出迴圈。使用完畢後,別忘了關閉裝置:

close(fd);
這個最簡單,當然上面只是說了最基本的操作函式,實際使用的時候當然要進行各種配置和處理。比如開啟串列埠後的處理:

// 恢復串列埠為阻塞狀態,這樣read函式不會立即返回

if(fcntl(fd, f_setfl, 0) < 0)

// 測試是否為終端裝置,這個需要包含標頭檔案if (0 == isatty(stdin_fileno))

// 清空輸入輸出快取

tcflush(fd, tcioflush);

實際使用串列埠通訊,肯定要先設定波特率,奇偶校驗和停止位,一般設定流程是先讀取當前的設定狀態,在此基礎上設定新的標誌。提到這些配置,就有必要先說明一下struct termio和struct termios結構體,兩個結構體內容是一致的,只不過struct termios是符合posix標準的系統,為了和之前的版本區分而新增了個s,包括的標頭檔案跟名字是相對應的:

#include #include
雖然結構體內容一樣,但操作的方式卻不同,如果用struct termio,獲取當前狀態的方式:

struct termio term_attr;

/* get current setting */

if (ioctl(fd, tcgeta, &term_attr) < 0)

而如果用struct termios,需要換為tcgetattr函式:

struct termios term_attr;

if (tcgetattr(fd, & term_attr) !=0)

先來設定波特率:

int   anspeedarr = ;

unsigned long audwnamearr = ;

int ret;

for (i = 0; i < sizeof(anspeedarr) / sizeof(int); i++)

tcflush(fd, tcioflush);

return;

}}

如果使用struct termios**如下:

int   anspeedarr = ;

unsigned long audwnamearr = ;

int ret;

for (i = 0; i < sizeof(anspeedarr) / sizeof(int); i++)

tcflush(fd, tcioflush);

return;

}}

設定資料位數,支援5、6、7、8:

/* set databits */

term_attr.c_cflag &= ~(csize); // 先遮蔽其他標誌位

switch (databits)

設定奇偶校驗:

/* set parity */

switch (parity)

設定停止位:

/* set stopbits */

switch (stopbits)

term_attr.c_cc[vtime] = 1;  // 讀取乙個字元等待1*(1/10)s

term_attr.c_cc[vmin] = 1; // 讀取字元的最少個數為1

這裡需要說明的是vmin,如果將其賦值為0的話,read()函式就變為非阻塞了,讀取不到資料就直接返回,讀取超時就需要我們自己設定了。

以下是一些其他配置設定:

// 修改控制模式,忽略 modem 控制線

term_attr.c_cflag |= clocal;

// 修改控制模式,使能從串列埠中讀取輸入資料

term_attr.c_cflag |= cread;

// 修改輸出模式,原始資料輸出

term_attr.c_oflag &= ~opost;

term_attr.c_lflag &= ~(icanon | echo | echoe | isig);

其他詳細的設定說明請參見這篇博文: 裡面寫得很詳細了。

設定完成後記得要使設定生效啊:

if (ioctl(fd, tcsetaw, &term_attr) < 0) 

對於使用struct termios結構體:

if (tcsetattr(fd, tcsanow, & term_attr) != 0)

好了,串列埠操作就介紹到這裡了。

6410 開發板掛載

一 實驗大致步驟 實驗檔案掛載步驟 1.首先啟動linux 系統,進入 liunx 下的檔案系統,進入它下面的 usr目錄,在 usr目錄下建乙個資料夾 yang 可以在資料夾裡面建立檔案 2.開啟終端,在終端上寫上minicom 按回車鍵,進入 6410 開發板的終端。3.另外開啟乙個終端,用命令...

OK6410開發板使用交換機搭建NFS

由於電腦只有乙個網口,所以如果和開發板直接網路連線的話,就無法聯網查詢資料了,對於向我這樣自學的人來說是件很痛苦的事情,還好宿舍有個交換機,就試了下看能不能通過交換機搭建nfs,這樣既不耽誤上網又可以通過nfs和開發板傳遞檔案,最後竟然成功了,現在分享下方法。本方法是將宿主機的某個目錄對映到開發板的...

飛凌ok6410開發板的按鍵驅動改程式

因為飛凌開發板自己在核心裡面整合了矩陣鍵盤的驅動,所以要用按鍵做實驗必須先禁用之前的驅動模組,否則的話無法註冊中斷,去檢視free irq的 在kernel irq manage.c中 可以發現,出現這個trying to free already free irq 101 告警的原因是 存在該中斷...