久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1470|回復: 4
收起左側

CC2530采集485型modbus傳感器數據,代碼如下,功能無法實現,希望大家進行指點,bu...

[復制鏈接]
ID:841786 發表于 2022-7-30 16:03 | 顯示全部樓層 |閱讀模式
#include <iocc2530.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define rs485_de P1_7
#define rs485_re P1_5
//延時啊
void delay(unsigned int t,unsigned int u)
{
        unsigned int i,j;
    for(i=0;i<t;i++)
        for(j=0;j<u;j++);
}

//延時
void Delay(uint n)
{
uint i;
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
}

void Init485_Port()
{
  //初始化RS485  
  P1SEL &= ~0xA0;            //P1-7作 P1-5為通用I/O口
  P1DIR |= 0xA0;            
}

void Init485_send()    //傳感器發送數據  
{
  Init485_Port();
  rs485_de =0;
  rs485_re =0;
}
void Init485_rec()    //傳感器發接收數據
{
  Init485_Port();
  rs485_de =1;
  rs485_re =1;
}
/* 485通信 */
unsigned char len;
unsigned char buf[40]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};  //讀取讀取葉面溫濕度設備(地址 0x01)的溫濕度值
int flagFrame = 0;  //幀接收完成標志,即接收到一幀新數據
int flagTxd = 0; //單字節發送完成標志,用來替代 TXD 中斷標志位
unsigned char cntRxd = 0;   //接收字節計數器
unsigned char  bufRxd[64];  //接收字節緩沖區

unsigned char TORH=0;//定時器中用到
unsigned char TORL=0;

unsigned int wendu_H=0x00;                 //溫度值高4位字節
unsigned int wendu_L=0x00;                 //溫度值低4位字節
unsigned int shidu_H=0x00;                 //濕度值高4位字節
unsigned int shidu_L=0x00;                 //濕度值低4位字節


/* 串口配置函數,baud-通信波特率 */
void initUART0(void)
{
  CLKCONCMD &= ~0x40;                           //設置系統時鐘源為32MHZ晶振
  while(CLKCONSTA & 0x40);                      //等待晶振穩定
  CLKCONCMD &= ~0x47;                           //設置系統主時鐘頻率為32MHZ

  PERCFG = 0x00;                                  //位置1 P0口
  P0SEL = 0x3c;                                  //P0用作串口
  P2DIR &= ~0XC0;                               //P0優先作為UART0   

  U0CSR |= 0x80;                                  //串口設置為UART方式
  U0GCR |= 7;                               
  U0BAUD |= 59;                                  //波特率設為4800
//中斷設置可能需要修改
  UTX0IF = 1; //UART0 TX 中斷標志初始置位 1
  U0CSR |= 0X40; //允許接收
  IEN0 |= 0x84; //開總中斷,接收中斷
}

/* 串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度 */
void UartWrite(unsigned char *buf, unsigned char len)
{
        Init485_rec();
    while (len--)  //循環發送所有字節
    {
        flagTxd = 0;       //清零發送標志
        U0DBUF = *buf++;     //發送一個字節數據
        while (!flagTxd); //等待該字節發送完成
    }
        Delay(500);
        Init485_send();
}

/* 串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度 */
unsigned char UartRead(unsigned char *buf, unsigned char len)
{
    unsigned char i;

    if (len > cntRxd)  //指定讀取長度大于實際接收到的數據長度時,
   {                     //讀取長度設置為實際接收到的數據長度
       len = cntRxd;
   }
   for (i=0; i<len; i++)  //拷貝接收到的數據到接收指針上
   {
       *buf++ = bufRxd[i];
   }
   cntRxd = 0;  //接收計數器清零
   return len;  //返回實際讀取長度
}


/* 串口接收監控,由空閑時間判定幀結束,需在定時中斷中調用,ms-定時間隔 */
void UartRxMonitor(unsigned char ms)
{
    static unsigned char cntbkp = 0;
    static unsigned char idletmr = 0;

    if (cntRxd > 0)  //接收計數器大于零時,監控總線空閑時間
    {
        if (cntbkp != cntRxd)  //接收計數器改變,即剛接收到數據時,清零空閑計時
        {
            cntbkp = cntRxd;
            idletmr = 0;
        }
        else                      //接收計數器未改變,即總線空閑時,累積空閑時間
        {
            if (idletmr < 30) //空閑計時小于 30ms 時,持續累加
            {
                idletmr += ms;
                if (idletmr >= 30) //空閑時間達到 30ms 時,即判定為一幀接收完畢
                {
                    flagFrame = 1;  //設置幀接收完成標志
                }
            }
        }
    }
    else
    {
        cntbkp = 0;
    }
}

/****************************************************************
                     中斷處理函數
****************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
if (URX0IF)  //接收到新字節
    {
        URX0IF = 0;  //清零接收中斷標志位
        if (cntRxd < sizeof(bufRxd)) //接收緩沖區尚未用完時,
        {                                 //保存接收字節,并遞增計數器
            bufRxd[cntRxd++] = U0DBUF;
        }
    }
    if (UTX0IF)  //字節發送完畢
    {
        UTX0IF = 0;   //清零發送中斷標志位
        flagTxd = 1;  //設置字節發送完成標志
    }

}

/****************************************************************
                     定時器
****************************************************************/
void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;
        tmp=16000000/12;          //12M晶振
        tmp=(tmp*ms)/1000;
        tmp=65536-tmp;
        tmp=tmp+33;
        T1CTL = 0x0d;
        TORH=(unsigned char)(tmp>>8);
        TORL=(unsigned char)tmp;
        T1CC0L=TORL;
        T1CC0H=TORL;
        T1IE=1;
        T1OVFIM=1;
        EA=1;
        T1CTL|=0x03;
}

void main()
{
ConfigTimer0(1);
initUART0();         //設置波特率2400
delay(200,500);
UartWrite(buf,len);         //向傳感器發送命令,01 03 02 00 00 03 04 73
if (flagFrame) //有命令到達時,讀取處理該命令
    {
       flagFrame = 0;
       len = UartRead(buf, sizeof(buf));  //將接收到的命令讀取到緩沖區中
        }
shidu_H=bufRxd[3];                //數據幀第3字節是溫度值高位,
shidu_L=bufRxd[4];                //數據幀第4字節是溫度值低位。
wendu_H=bufRxd[5];                //數據幀第4字節是溫度值高位,
wendu_L=bufRxd[6];                //數據幀第5字節是溫度值低位。
}
/****************************************************************
                     定時器中斷
****************************************************************/
#pragma vector = T1_VECTOR
__interrupt void T1_INT(void)
{
        T1CC0L=TORL;
        T1CC0H=TORH;
        UartRxMonitor(1);  //串口接收監控
}


回復

使用道具 舉報

ID:401564 發表于 2022-7-30 18:07 | 顯示全部樓層
你這延時,看著都別扭,用得著5個for嗎?485是要先操作DE和RE來確定為接收還是發送模式的
485可以連續發送多個字節,可以用數組發送
這是我的485發送程序,你參考一下
Delay10us:10uS延時函數
Send_Out_Byte:串口發送一個字節函數,根據不同單片機,自己寫
void Send_Rs485(unsigned char *buf,unsigned char len)//RS485發送數據,待發送數據指針buf,數據長度len
{
        RE=1;                                        //RS485設定為發送狀態
        Delay10us(5);                         //此處要加延時,讓MAX485有反應的時間
        do
        {                               
                Send_Out_Byte(*buf);//通過串口發送到485總線
                buf++;
        }
        while(len--);
        Delay10us(5);                        //延時
        RE=0;                                        //RS485設定為接收狀態
}

回復

使用道具 舉報

ID:920086 發表于 2025-5-9 16:37 | 顯示全部樓層
解決了嗎吧主
回復

使用道具 舉報

ID:920086 發表于 2025-5-10 09:00 | 顯示全部樓層
有結果了嗎
回復

使用道具 舉報

ID:940483 發表于 2025-5-13 14:26 | 顯示全部樓層
我看你這個“01 03 02 00 00 03 04 73”   buf數組初始化為8bit,可len沒初始化。”UartWrite(buf, len)“ len的值為0,導致發送錯誤。len應置8,因為buf數組有八個元素。。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人在线免费 | 精品国产一区一区二区三亚瑟 | 国产精品久久久久久久久久尿 | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 一级毛片色一级 | 欧美日韩国产在线观看 | 精品一区二区三区中文字幕 | 国产96在线 | 亚洲成人免费网址 | 秋霞a级毛片在线看 | 日韩av网址在线观看 | 91久久综合 | 国产欧美日韩视频 | 欧美日在线 | 亚洲高清视频一区二区 | av手机在线免费观看 | 亚州春色| 国产精品日韩在线观看一区二区 | 午夜天堂精品久久久久 | 国产在线一区二区三区 | 成人a视频片观看免费 | 久久久九九 | 综合久久av | 欧美日产国产成人免费图片 | 亚洲精品成人 | 国产成人精品一区二区三区视频 | 可以免费观看的av片 | 免费在线成人 | 日韩成人高清 | 欧美区日韩区 | 涩涩视频大全 | www.久久国产精品 | 观看av| av中文字幕在线观看 | 亚洲综合中文字幕在线观看 | 欧美影院 | 日本一区二区不卡 | 国产亚洲一区二区三区 | 波霸ol一区二区 | 色婷婷综合久久久久中文一区二区 | 国产人成精品一区二区三 |