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