嵌入式开发板RS485协议串口编程——角度传感器数据读取
嵌入式開發(fā)板RS485協(xié)議串口編程——傾角傳感器數(shù)據(jù)讀取
之前分享過一篇嵌入式操作系統(tǒng)開發(fā)板中的串口編程——光敏電阻數(shù)據(jù)讀取,是基于TTL協(xié)議的串口編程,本節(jié)主要講述基于RS485協(xié)議的串口編程,掌握了這兩種嵌入式開發(fā)板的串口編程方法,就基本掌握了嵌入式開發(fā)板中對(duì)于大多數(shù)傳感器的數(shù)據(jù)讀取。
RS485通信協(xié)議
RS485通信協(xié)議是一種串行通信協(xié)議,相比于RS232通信協(xié)議通信距離短、速率低的缺點(diǎn),RS485傳輸距離更長,傳輸速率最高可達(dá)10Mbit/s。RS485通信協(xié)議采用的是半雙工工作方式,只能有一點(diǎn)處于發(fā)送狀態(tài),因此,在程序中或者電路設(shè)計(jì)中要有一個(gè)切換發(fā)送狀態(tài)與接收狀態(tài)的標(biāo)志位。關(guān)于在程序中的標(biāo)志位待會(huì)在程序中我會(huì)介紹,電路中的標(biāo)志位如下:
與RS232不同的還有,RS485的工作方式是差分工作方式,所謂差分工作方式,是指在一堆雙絞線中,一條定義為A,一條定義為B。通常情況下,發(fā)送驅(qū)動(dòng)器A、B之間的正電平在+2+6V,是一個(gè)邏輯狀態(tài),負(fù)電平在-2-6V,是另一個(gè)邏輯狀態(tài)(和RS232是相反的),另有一個(gè)引腳信號(hào)接地。
傾角傳感器RS485通信協(xié)議
我使用是維特智能的一款傾角傳感器——SINDT-RS485。具體的描述可以參考它的使用說明書,我這里就不贅述了。
它的工作電壓和線色的定義如下所示:
通過上面的已知條件就可以得到和嵌入式開發(fā)板上RS485串口的連接方式:
我們的目的是讀取傾角傳感器實(shí)時(shí)測得的X、Y、Z軸的角度信息。通過閱讀使用說明書可以得到,我們需要先給傾角傳感器發(fā)送角度信號(hào)指令,傾角傳感器才會(huì)給我們發(fā)送它實(shí)時(shí)檢測的數(shù)據(jù)。角度信號(hào)指令如下:
其中MODADDR為傾角傳感器地址0x50。傾角傳感器上傳回來的數(shù)據(jù)格式如下:
有了以上的信息,我們就可以開始著手編程實(shí)現(xiàn)啦!!
嵌入式開發(fā)板RS485串口編程
首先就是打開RS485串口的設(shè)備節(jié)點(diǎn):
int open_port(char *com) {int fd;fd = open(com, O_RDWR|O_NOCTTY);if (-1 == fd){return(-1);}if(fcntl(fd, F_SETFL, 0)<0) /* 設(shè)置串口為阻塞狀態(tài)*/{printf("fcntl failed!\n");return -1;}return fd; }之后要初始化串口,設(shè)置波特率、數(shù)據(jù)位、停止位、奇偶校驗(yàn)位等。初始化程序我之前已經(jīng)貼在嵌入式操作系統(tǒng)開發(fā)板串口編程——光敏電阻數(shù)據(jù)讀取里了,這里我就贅述了。
然后就是向傾角傳感器發(fā)送角度信號(hào)指令,我把指令放在一個(gè)字符數(shù)組里:
static char byteSend[8]; byteSend[0] = 0x50; byteSend[1] = 0x03; byteSend[2] = 0x00;//寄存器高位 byteSend[3] = 0x3d;//寄存器低位 //角度寄存器 byteSend[4] = 0x00;//寄存器個(gè)數(shù)高位 byteSend[5] = 0x03;//寄存器個(gè)數(shù)低位 byteSend[6] = 0x99;//CRCH byteSend[7] = 0x86;//CRC在主程序里把指令發(fā)送出去,并設(shè)置標(biāo)志位,發(fā)送之后讀取角度信息:
int main(int argc, char **argv) {int fd;int iRet;fd = open_port(argv[1]);serial_uart_init(fd);char context;int i = 0;int j = 0;int flag = 0;char r_buf[10];char readtext;while (1){while(flag == 0){if(i > 7){flag = 1;i = 0;break;}context = byteSend[i];iRet = write(fd, &context, sizeof(context));i++;}usleep(50000);bzero(r_buf, 10);while(flag == 1){//讀傳感器發(fā)送過來的數(shù)據(jù),并解析處理if(j > 9){flag = 0;j = 0;break;}iRet = read(fd, &readtext, sizeof(readtext));r_buf[j] = readtext;//printf("read:%02x\n", r_buf[j]);j++;}usleep(50000);if(r_buf[0] == 0x50 && r_buf[1] == 0x03){printf("AngleX:%7.3f, AngleY:%7.3f, AngleZ:%7.3f\n", ((float)((r_buf[3]<<8) | r_buf[4])/32768.0*180),((float)((r_buf[5]<<8) | r_buf[6])/32768.0*180),((float)((r_buf[7]<<8) | r_buf[8])/32768.0*180)); }}return 0; }到這里程序就已經(jīng)完成了。
在Ubuntu中用交叉編譯工具編譯程序:
將傾角傳感器按照前面介紹的連接方式連接到開發(fā)板上,就可以運(yùn)行程序了,結(jié)果如下:
到這里就成功實(shí)現(xiàn)了讀取傾角傳感器的角度信息啦,還可以讀取加速度,磁場等等信息。
在嵌入式開發(fā)過程中,光掌握串口編程還是不夠的。下一節(jié)我將介紹嵌入式開發(fā)板中CAN通信編程實(shí)例,用CAN通信來驅(qū)動(dòng)伺服電機(jī)。掌握了串口編程和CAN通信編程,你就可以完成一些具體的嵌入式開發(fā)的項(xiàng)目啦。
完整代碼我會(huì)貼在公眾號(hào)中,需要完整代碼的關(guān)注公眾號(hào)回復(fù)RS485串口編程獲取。有什么問題也可以在下方留言,我看到之后會(huì)回復(fù)你。
我是河邊小烏龜爬,學(xué)習(xí)嵌入式軟件開發(fā)路上的一名小學(xué)生,歡迎大家相互交流哇。公眾號(hào):河邊小烏龜爬。
(群名稱:嵌入式軟件開發(fā)交流群;群 號(hào):1004953094)
總結(jié)
以上是生活随笔為你收集整理的嵌入式开发板RS485协议串口编程——角度传感器数据读取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零开始构建嵌入式实时操作系统1——任务
- 下一篇: 单片机:LCD1602