在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 告警的原因是 存在該中斷...