新聞中心
隨著物聯(lián)網(wǎng)技術(shù)的發(fā)展,越來越多的設(shè)備需要與外界進(jìn)行通信,其中串口通信是十分常見的一種通信方式。在嵌入式領(lǐng)域,串口通信也被廣泛應(yīng)用。本文將介紹如何在ARM Linux系統(tǒng)中進(jìn)行串口通信,希望對初學(xué)者有所幫助。

公司主營業(yè)務(wù):網(wǎng)站制作、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出鐘樓免費(fèi)做網(wǎng)站回饋大家。
一、硬件環(huán)境搭建
在進(jìn)行串口通信時,首先需要配置硬件環(huán)境。我們需要一臺基于ARM架構(gòu)的開發(fā)板,并連接一根串口線,將其一端連接到開發(fā)板的串口接口,另一端連接到PC的串口接口。這里需要注意的是,由于現(xiàn)在的PC通常都沒有串口接口,需要使用USB轉(zhuǎn)串口線進(jìn)行轉(zhuǎn)換。因此,我們需要使用一款支持USB轉(zhuǎn)串口的轉(zhuǎn)接器。
接下來,我們需要編寫一份設(shè)備樹文件,將串口的信息告訴Linux系統(tǒng)。設(shè)備樹是一種描述硬件設(shè)備的數(shù)據(jù)結(jié)構(gòu),可以告訴內(nèi)核有哪些硬件設(shè)備,位于哪個地址,如何訪問,以及與其他設(shè)備的連接方式等信息。以下是一個示例設(shè)備樹文件:
“`
&uart1 {
pinctrl-names = “default”;
pinctrl-0 = ;
status = “okay”;
clock-frequency = ;
interrupt-parent = ;
interrupts = ;
tx-pin = ;
rx-pin = ;
};
&gpio {
status = “okay”;
};
&uart1_pins {
phandle = ;
gpio-pin = ;
linux,phandle = ;
phandle = ;
phandles = ;
};
“`
在這個設(shè)備樹文件中,我們定義了一個叫做uart1的串口設(shè)備,它位于GPIO口20和21之間。這里的clock-frequency表示串口的時鐘頻率,這里設(shè)置為24576000。interrupt-parent表示中斷信號的控制器,這里設(shè)置為GPIO。interrupts表示需要監(jiān)聽的中斷信號,這里設(shè)置為GPIO口20上的上升沿觸發(fā)中斷。tx-pin表示串口的發(fā)送引腳,rx-pin表示串口的接收引腳。
二、驅(qū)動程序開發(fā)
在硬件環(huán)境搭建好之后,我們需要開發(fā)串口驅(qū)動程序,將數(shù)據(jù)從串口發(fā)送到PC端,并從PC端接收數(shù)據(jù)。在ARM Linux中,串口通信使用的是ttyS設(shè)備文件。我們可以通過打開這個設(shè)備文件來進(jìn)行串口通信。以下是一個最簡單的串口驅(qū)動程序的代碼:
“`
#include
#include
#include
#include
#include
int mn(int argc, char* argv[])
{
int fd;
char buf[64];
fd = open(“/dev/ttyS1”, O_RDWR | O_NOCTTY);
if (fd
{
perror(“open”);
return -1;
}
struct termios tio;
memset(&tio, 0, sizeof(tio));
cfsetspeed(&tio, B115200);
tio.c_cflag |= (CLOCAL | CREAD);
tio.c_cflag &= ~PARENB;
tio.c_cflag &= ~CSTOPB;
tio.c_cflag &= ~CSIZE;
tio.c_cflag |= CS8;
tio.c_cc[VMIN] = 0;
tio.c_cc[VTIME] = 10;
tcsetattr(fd, TCSANOW, &tio);
write(fd, “Hello, world!\r\n”, 15);
while (1)
{
int n = read(fd, buf, sizeof(buf));
if (n > 0)
{
printf(“Read %d bytes: %.*s\n”, n, n, buf);
}
}
close(fd);
return 0;
}
“`
在這個程序中,首先調(diào)用open函數(shù)打開ttyS1設(shè)備文件,然后通過設(shè)置termios結(jié)構(gòu)體中的參數(shù)來配置串口通信的格式。其中cfsetspeed函數(shù)用來設(shè)置串口的波特率,tio.c_cflag表示串口控制標(biāo)志位,CLOCAL用來表示不使用串口控制,CREAD表示允許讀寫,PARENB表示不使用奇偶校驗(yàn),CSTOPB表示使用1位停止位,CSIZE表示數(shù)據(jù)位的大小,這里設(shè)置為8位。tio.c_cc[VMIN]和tio.c_cc[VTIME]表示等待數(shù)據(jù)的最短時間和最長時間,這里設(shè)置為0和10。
接著,我們使用write函數(shù)往串口里寫入一串字符串。然后通過循環(huán)調(diào)用read函數(shù)來讀取串口中的數(shù)據(jù),并打印出來。我們使用close函數(shù)關(guān)閉串口設(shè)備文件。
三、運(yùn)行程序測試
在程序開發(fā)完成之后,我們可以將程序拷貝到開發(fā)板上,并運(yùn)行。運(yùn)行程序時,需要使用root權(quán)限,否則會出現(xiàn)權(quán)限不足的錯誤。我們可以使用sudo命令來運(yùn)行程序,如下所示:
“`
sudo ./serial
“`
運(yùn)行程序之后,程序?qū)⑾虼谥邪l(fā)送一串字符串,并等待從串口中讀取到數(shù)據(jù)。我們可以在PC端使用串口調(diào)試助手等工具,向串口中發(fā)送數(shù)據(jù)。如果一切正常,程序?qū)x取到數(shù)據(jù),并在控制臺中輸出。
相關(guān)問題拓展閱讀:
- 如何去掉ARM-LINUX啟動時輸出到串口的調(diào)試信息
如何去掉ARM-LINUX啟動時輸出到串口的調(diào)試信息
啟動時的內(nèi)核信息都是通過巧頃printk輸出的,查了下頭文件kernel.h,讓寬絕有這樣的語句
#ifdef CONFIG_PRINTK
alinkage int printk(const char * fmt, …)
__attribute__ ((format (printf, 1, 2)));
#else
static inline int printk(const char *s, …)
__attribute__ ((format (printf, 1, 2)));
static inline int printk(const char *s, …) { return 0; }
#endif
在kernel/printk.c中,同樣可以看到在沒有定義CONFIG_PRINTK的時候其坦姿代碼都是灰的。
因此,去掉CONFIG_PRINTK的定義即可。
關(guān)注這個問題
關(guān)于arm linux使用串口的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
本文標(biāo)題:玩轉(zhuǎn)ARMLinux:串口通信實(shí)踐指南(armlinux使用串口)
地址分享:http://m.fisionsoft.com.cn/article/dhseegh.html


咨詢
建站咨詢
