国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于STM32 RS485傳感器數(shù)據(jù)采集(參考正點原子部分代碼)

這篇具有很好參考價值的文章主要介紹了基于STM32 RS485傳感器數(shù)據(jù)采集(參考正點原子部分代碼)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目前工業(yè)上,傳感器一般都選RS485,modbus通訊協(xié)議,這種通訊方式,有很強的魯棒性,本篇文章基于原子哥的精英板進行開發(fā)。

1、初始化與電腦通信的串口(PA9 PA10)

//初始化USART2
void RS485_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//PA2(TX)復用推挽輸出
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_2);//默認高電平
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//PA3(RX)輸入上拉
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;   //修改原GPIO_Mode_IPU(輸入上拉)->GPIO_Mode_IN_FLOATING(浮空輸入)/
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;//修改PG9(RE/DE)通用推挽輸出->PD7(RE/DE)通用推挽輸出//
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOD,&GPIO_InitStructure);
        GPIO_ResetBits(GPIOD,GPIO_Pin_7);//默認接收狀態(tài)
        
        USART_DeInit(USART2);//復位串口2
        USART_InitStructure.USART_BaudRate=RS485_Baudrate;
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_InitStructure.USART_WordLength=USART_WordLength_8b;
        USART_InitStructure.USART_StopBits=USART_StopBits_1;
        USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收發(fā)模式
        switch(RS485_Parity)
        {
                case 0:USART_InitStructure.USART_Parity=USART_Parity_No;break;//無校驗
                case 1:USART_InitStructure.USART_Parity=USART_Parity_Odd;break;//奇校驗
                case 2:USART_InitStructure.USART_Parity=USART_Parity_Even;break;//偶校驗
        }
        USART_Init(USART2,&USART_InitStructure);
        
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//使能串口2接收中斷
        
        NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        USART_Cmd(USART2,ENABLE);//使能串口2
        RS485_TX_EN=1;//模式
        
        Timer7_Init();//定時器7初始化,用于監(jiān)視空閑時間
        //Modbus_RegMap();//Modbus寄存器映射
}

2、采用串口中斷將數(shù)據(jù)保存到數(shù)組buff中

void RS485_SendData(u8 *buff,u8 len)
{ 
		RS485_TX_EN=1;//切換為發(fā)送模式
		while(len--)
		{
						while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//等待發(fā)送區(qū)為空
						USART_SendData(USART2,*(buff++));
		}
		while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);//等待發(fā)送完成
		TX_RX_SET=1; //發(fā)送命令完成,定時器T4處理接收到的數(shù)據(jù)
		RS485_TX_EN=0;
}

3、用定時器來配置一幀字節(jié)是否結(jié)束(空閑時間>指定時間)

void TIM7_IRQHandler(void)
{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?? ?if(TIM_GetITStatus(TIM7,TIM_IT_Update)!=RESET)
?? ?{
?? ??? ?TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除中斷標志
?? ??? ?TIM_Cmd(TIM7,DISABLE);//停止定時器
?? ??? ?RS485_TX_EN=1;//默認為發(fā)送模式 ? ? ? 485模式控制.0,接收;1,發(fā)送.
?? ??? ?RS485_RxFlag=1;//置位幀結(jié)束標記
//?? ??? ?errpace=1;
?? ?}
}


4、主機發(fā)送請求指令(從機地址、功能碼 、起始地址、讀取個數(shù))

void modbus_rtu(void)
{?? ?
?? ?static u8 i=0;
?? ?static u8 j=0;
?? ?switch(i)
?? ?{
?? ??? ?case 0: ? ? ?//modbus執(zhí)行命令第一步。
?? ??? ??? ??? ?//RS485_TX_Service(); ?//向從機發(fā)送一個請求。就在此時發(fā)送完成TX_RX_SET=1 發(fā)送命令完成,定時器T4處理接收到的數(shù)據(jù)
?? ??? ? ? ?//在此處也可以直接寫Master_Service( SlaverAddr, Fuction, StartAddr, ValueOrLenth);
?? ??? ? ? ?//多次通訊結(jié)果可以按照類似的封裝進行填寫
?? ??? ? ? ?
?? ??? ? ? ?RS485_TX_Service();
??? ? ??? ??? ?if(TX_RX_SET) i=1; //發(fā)送,接受命令切換。 0 發(fā)送模式 1 接受模式
?? ??? ? ? ?
?? ??? ?
?? ??? ? ? ?state=1;
?? ??? ??? ??? ?break;
?? ??? ?case 1: ? ? //modbus命令執(zhí)行第二步。
?? ??? ??? ??? ?RS485_RX_Service(); ?//執(zhí)行數(shù)據(jù)接收?
?? ??? ? ? ?state=2;
?? ??? ??? ??? ?if(ComErr==0) ?//如果什么錯誤都沒有發(fā)生
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?i=2;//完成命令更換功能碼!
?? ??? ??? ??? ?} //一次通訊已經(jīng)完成
?? ??? ??? ??? ?else ? //錯誤接收后再次準備接收
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?i=1;//
?? ??? ??? ??? ??? ?j++;//一個命令發(fā)送3次沒有應答切換下一個命令
?? ??? ??? ??? ??? ?if(j>=2)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?j=0;
?? ??? ??? ??? ??? ??? ?i=2;
?? ??? ??? ??? ??? ??? ?ComErr=7; ?//通訊超時
?? ??? ??? ??? ??? ?}?? ??? ??? ??? ?
?? ??? ??? ??? ?}
?? ??? ??? ??? ?break;
?? ??? ?case 2: //從機地址++?? ?
?? ??? ? ? ?i=0;
?? ??? ? ? ?state=3;
?? ??? ??? ??? ?break;
?? ??? ?case 3://功能碼,這個是空余出來做報錯以及其他處理的
?? ??? ??? ??? ?break;?? ??? ??? ??? ?
?? ??? ??? ?
?? ?}
?? ?
}

5、從機響應,通過校驗碼判斷數(shù)據(jù)是否成功

u16 CRC_Compute(u8 *puchMsg, u16 usDataLen) 
{ 
	u8 uchCRCHi = 0xFF ; 
	u8 uchCRCLo = 0xFF ; 
	u32 uIndex ; 
	while (usDataLen--) 
	{ 
		uIndex = uchCRCHi ^ *puchMsg++ ; 
		uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ; 
		uchCRCLo = auchCRCLo[uIndex] ; 
	} 
	return ((uchCRCHi<< 8)  | (uchCRCLo)) ; 
}//uint16 crc16(uint8 *puchMsg, uint16 usDataLen)

6、處理主機采集到的數(shù)據(jù)

void USART2_IRQHandler(void)//串口2中斷服務程序
{
?? ? ??
? ? ? ? u8 res;
? ? ? ? u8 err;
?? ??
? ? ? ? if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
? ? ? ? {
? ? ? ? ? ? ? ? if(USART_GetFlagStatus(USART2,USART_FLAG_NE|USART_FLAG_FE|USART_FLAG_PE)) {err=1;errpace=2;}//檢測到噪音、幀錯誤或校驗錯誤
? ? ? ? ? ? ? ? else err=0;
? ? ? ? ? ? ? ? res=USART_ReceiveData(USART2); //讀接收到的字節(jié),同時相關(guān)標志自動清除
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? if((RS485_RX_CNT<2047)&&(err==0))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? RS485_RX_BUFF[RS485_RX_CNT]=res;
? ? ? ? ? ? ? ? ? ? ? ? RS485_RX_CNT++;
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除定時器溢出中斷
? ? ? ? ? ? ? ? ? ? ? ? TIM_SetCounter(TIM7,0);//當接收到一個新的字節(jié),將定時器7復位為0,重新計時(相當于喂狗)
? ? ? ? ? ? ? ? ? ? ? ? TIM_Cmd(TIM7,ENABLE);//開始計時
? ? ? ? ? ? ? ? }
? ? ? ? }
}

void Modbus_03_Solve(void)
{
? ? u8 i;
?? ??? ?//u8 RegNum;
? ? ? ? //RegNum= RS485_RX_BUFF[2]/2;//獲取字節(jié)數(shù) 6---->?
? ? ? ? if(1)//寄存器地址+數(shù)量在范圍內(nèi)
? ? ? ? {
? ? ? ? ? ? ? ? for(i=0;i<20;i++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ?Master_ReadReg[StartAddr+i]= RS485_RX_BUFF[3+i*2]; ? ? ? ? ? /高8位
? ? ? ? ? ? ? ? ? ? ? ?Master_ReadReg[StartAddr+i]= RS485_RX_BUFF[4+i*2]+(Master_ReadReg[StartAddr+i]<<8);// 低8位+高8位
?? ??? ??? ??? ??? ??? ??? ??? ??? ? ? ? Master_ReadReg[i]= RS485_RX_BUFF[3+i*2];?
?? ??? ??? ??? ??? ??? ??? ??? ??? ? ? ? Master_ReadReg[i]= RS485_RX_BUFF[4+i*2]+(Master_ReadReg[i]<<8);// 低8位+高8位
?? ??? ??? ??? ??? ?
?
? ? ? ? ? ? ? ? }
?? ??? ??? ?temp=Master_ReadReg[0];
? ? ? ? ?x_shock=Master_ReadReg[1];
?? ??? ?y_shock=Master_ReadReg[2];
?? ??? ?z_shock=Master_ReadReg[3];?? ??? ? ? ? ?? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ? ? ? //volback(message);
?? ??? ??? ??? ? ComErr=0;
? ? ? ? }
?? ??? ?else
?? ??? ?{
?? ??? ??? ?
?? ??? ??? ??? ?ComErr=3;
?? ??? ?}
?? ??? ?TX_RX_SET=0; //命令完成
}

//Modbus功能碼05處理程序 ? ///程序已驗證OK
//寫單個輸出開關(guān)量
void Modbus_05_Solve(void)
{
? ? ? ?u16 i;
?? ? ? i=ValueOrLenth;
?? ? ? if((i>0&&RS485_RX_BUFF[4]==0XFF&&RS485_RX_BUFF[5]==0X00)||(i==0&&RS485_RX_BUFF[4]==0X00&&RS485_RX_BUFF[5]==0X00))
?? ? ? {
?? ??? ??? ?ComErr=0;
?? ??? ??? ?
?? ? ? }
?? ? ? else
?? ? ? {
?? ??? ??? ?ComErr=5;
?? ? ? }
?? ? ? TX_RX_SET=0; //命令完成?? ? ??
}

//Modbus功能碼06處理程序 ? //已驗證程序OK
//寫單個保持寄存器
void Modbus_06_Solve(void)
{
?? ??? ?u16 i; //數(shù)據(jù)返回校驗用 ? ?
?? ??? ?i=(((u16)RS485_RX_BUFF[4])<<8)|RS485_RX_BUFF[5];//獲取寄存器數(shù)量
? ? ? ? if(i==Master_WriteReg[StartAddr])
?? ??? ?{
?? ??? ??? ?ComErr=0;
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?ComErr=6;
?? ??? ?}
?? ??? ?TX_RX_SET=0; //命令完成

}
//Modbus功能碼15處理程序 ? //程序已驗證OK
//寫多個輸出開關(guān)量
void Modbus_15_Solve(void)
{
? ? ? ? u16 i;//數(shù)據(jù)返回校驗用
? ? ? ? i=(((u16)RS485_RX_BUFF[4])<<8)|RS485_RX_BUFF[5];//獲取寄存器數(shù)量
? ? ? ? ?if(i==ValueOrLenth)
?? ??? ?{
?? ??? ??? ?ComErr=0;
?? ??? ?}
? ? ? ? ?else
?? ??? ?{
?? ??? ??? ?ComErr=15;
?? ??? ?}
?? ??? ?TX_RX_SET=0; //命令完成 ??
}

//返回溫度值
u16 temperature(void)
{
?? ?return temp;
}
?//返回x 振動
u16 X_shock(void)
{
?? ?return x_shock;
}
?? ?
//返回y 振動
u16 Y_shock(void)
{
?? ?return y_shock;
}
//返回z 振動
u16 Z_shock(void)
{
?? ?return z_shock;
}

7、結(jié)果展示

基于STM32 RS485傳感器數(shù)據(jù)采集(參考正點原子部分代碼)

有什么疑問或想要完整程序可私聊我 ,平時回消息都比較快文章來源地址http://www.zghlxwxcb.cn/news/detail-509343.html

到了這里,關(guān)于基于STM32 RS485傳感器數(shù)據(jù)采集(參考正點原子部分代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • Python 與 RS-485 傳感器設備進行串口通信, 讀取數(shù)值

    Python 與 RS-485 傳感器設備進行串口通信, 讀取數(shù)值

    基礎準備 使用的485設備 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.29902e8dKQTU6did=584607646349_u=p208d7bb2e05dc ??? 485設備資料 ??導軌式溫濕度傳感器.pdf 使用的Python庫 pyserial (非內(nèi)置庫) 將RS - 485傳感器設備先轉(zhuǎn)成RS-232, 然后將RS -232轉(zhuǎn)成USB串口, 插入到串口, 即可使用電腦COM進行串口通

    2024年02月04日
    瀏覽(18)
  • STM32實現(xiàn)薄膜壓力傳感器數(shù)據(jù)采集(標準庫和HAL庫實現(xiàn))

    STM32實現(xiàn)薄膜壓力傳感器數(shù)據(jù)采集(標準庫和HAL庫實現(xiàn))

    單片機型號及壓力傳感器: STM32F103C8T6 最小系統(tǒng)板 壓力傳感器選用的是薄膜壓力傳感器 生活中經(jīng)常遇到需要測量壓力值,因此,考慮到這樣的需求從網(wǎng)上買了一個薄膜壓力傳感器,實物圖如下: 柔性薄膜壓力傳感器的 產(chǎn)品特點 : 超薄,厚度小于0.3mm 響應速度快 壽命長,通

    2024年02月02日
    瀏覽(15)
  • STM32采集問答式串口傳感器數(shù)據(jù)寫入SD卡(spi模式)

    STM32采集問答式串口傳感器數(shù)據(jù)寫入SD卡(spi模式)

    STM32f103RCT6板子 問答式溫濕度傳感器(TTL信號) 外接SD卡模塊(淘寶都差不多) 1. SD卡模塊 ,采用SPI1接線 (CLK)SCK —PA5 (DATA0)MISO —PA6 (CMD)MOSI —PA7 (DATA3)CS —PA4 前面小括號里的是SDIO模式的接線,可以忽略。 2. 傳感器模塊 問答式TTL信號的傳感器都可以, 連接到板子的串口2,

    2024年02月05日
    瀏覽(41)
  • TCP透傳數(shù)據(jù)至Onenet平臺(簡單用STM32上傳采集的傳感器數(shù)據(jù))

    TCP透傳數(shù)據(jù)至Onenet平臺(簡單用STM32上傳采集的傳感器數(shù)據(jù))

    主頁點擊控制臺 ?點擊全部產(chǎn)品服務,再點擊多協(xié)議接入 ?選擇TCP透傳,點擊添加產(chǎn)品 ? ? ?點擊確定,然后選擇立即添加設備 ?點擊添加設備 ?隨便起個設備名稱,這里的鑒權(quán)信息等下要用來作為登錄設備用,點擊添加 ?添加數(shù)據(jù)流模板,就是綁定上傳的數(shù)據(jù) ? ? ?這里我

    2024年02月05日
    瀏覽(23)
  • Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中斷+定時器+RTC的多傳感器數(shù)據(jù)采集系統(tǒng)(2*ADXL355和ADXL375通過Sync時序同步)

    Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中斷+定時器+RTC的多傳感器數(shù)據(jù)采集系統(tǒng)(2*ADXL355和ADXL375通過Sync時序同步)

    本文的初衷一方面是將我的一些關(guān)于STM32開發(fā)方面淺顯的個人經(jīng)驗分享給初學者、并期望得到大佬的批評指正,另一方面是記錄自己的實驗過程便于回顧。 我預感應該要寫很多,不過鑒于之前的數(shù)篇筆跡中,對于SPI/DMA/ADXL3XX系列加表的使用已經(jīng)詳細描述過了,所以這篇博客只

    2024年02月10日
    瀏覽(24)
  • 搬運機器人RFID傳感器CNS-RFID-01|1S的RS485(MODBUS|HS協(xié)議)通訊連接方法

    搬運機器人RFID傳感器CNS-RFID-01|1S的RS485(MODBUS|HS協(xié)議)通訊連接方法

    搬運機器人RFID傳感器CNS-RFID-01|1S支持RS485通信,可支持RS485(MODBUS RTU)協(xié)議、RS485-HS協(xié)議,廣泛應用于物流倉儲,立庫 AGV|無人叉車|搬送機器人等領(lǐng)域,常用定位、駐車等,本篇重點介紹CNS-RFID-01|1S RFID傳感器的RS485通信連接方法。 CNS-RFID-01|1S RFID傳感器 1、RS485連接方法 用線纜

    2024年02月04日
    瀏覽(29)
  • 基于STM32的土壤濕度傳感器使用

    基于STM32的土壤濕度傳感器使用

    最近在學習中用到了ADC數(shù)據(jù)采集這里使用的硬件模塊為土壤濕度傳感器,下面為土壤傳感器相關(guān)的使用方法和代碼介紹。 1、土壤濕度傳感器實物圖 土壤濕度傳感器一共有4個引腳分別為: GND VCC DO AO,在本次實驗中使用的為A0模擬引腳,因此在單片機資源上需要使用到ADC,模

    2024年02月12日
    瀏覽(28)
  • 基于STM32的雙軸XY搖桿傳感器模塊使用

    基于STM32的雙軸XY搖桿傳感器模塊使用

    本文主要介紹的是如何通過STM32核心板 控制 雙軸XY搖桿傳感器模塊 以及將傳感信息打印到串口調(diào)試助手 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 外形如圖所示,共五個引腳 分別是VCC GND X軸傳感模擬量輸出 以及 Y軸傳感模擬量輸出 以及一個SW按鍵數(shù)字量輸出 搖桿

    2024年02月03日
    瀏覽(22)
  • SPI傳感器接口設計與優(yōu)化:基于STM32的實踐

    SPI傳感器接口設計與優(yōu)化:基于STM32的實踐

    SPI(串行外設接口)是一種常用的串行通信協(xié)議,用于在微控制器和外部設備之間進行全雙工的高速數(shù)據(jù)傳輸。 在本文中,我們將探討如何基于STM32微控制器設計和優(yōu)化SPI傳感器接口,并提供相應的代碼示例。 1. SPI傳感器接口設計 SPI傳感器接口設計的主要目標是實現(xiàn)可靠、

    2024年01月19日
    瀏覽(37)
  • IIC學習之SHT30溫濕度傳感器(基于STM32)

    IIC學習之SHT30溫濕度傳感器(基于STM32)

    附上SHT30資料和邏輯分析儀源文件,點擊下載 關(guān)于IIC的介紹網(wǎng)上已經(jīng)非常詳盡,這里只說重點: 雙線(SDA,SCL),半雙工 采用主從結(jié)構(gòu),支持一主多從,通過地址尋址,每個I2C設備都有唯一的7位或10位地址,還有1bit選擇讀寫(0為寫,1為讀) 速率較低,I2C總線支持多種通信

    2024年02月01日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包