日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

嵌入式开发板RS485协议串口编程——角度传感器数据读取

發(fā)布時(shí)間:2023/12/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式开发板RS485协议串口编程——角度传感器数据读取 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

嵌入式開發(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。