打印
[STM32F1]

关于RS485通信的问题

[复制链接]
1198|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ycao24|  楼主 | 2014-12-18 19:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32485外接传感器,发送查询指令,返回采集数据。如何实现?新人望大伙多多指教。
沙发
ycao24|  楼主 | 2014-12-18 19:36 | 只看该作者
求指导啊   大神们

使用特权

评论回复
板凳
ycao24|  楼主 | 2014-12-18 22:37 | 只看该作者
没人指导哦

使用特权

评论回复
地板
fanxsd| | 2014-12-19 09:12 | 只看该作者
百度 例子太多啦!

使用特权

评论回复
5
小班儿| | 2014-12-19 09:20 | 只看该作者
简单的搞个485芯片(非隔离)具体电路百度吧,很简单;复杂的就是搞个隔离的,信号隔离用高速光耦,电源隔离找电源模块吧(IB0505)。

使用特权

评论回复
6
ycao24|  楼主 | 2014-12-19 09:28 | 只看该作者
fanxsd 发表于 2014-12-19 09:12
百度 例子太多啦!

百度的都是不合适的

使用特权

评论回复
7
ycao24|  楼主 | 2014-12-19 09:29 | 只看该作者
小班儿 发表于 2014-12-19 09:20
简单的搞个485芯片(非隔离)具体电路百度吧,很简单;复杂的就是搞个隔离的,信号隔离用高速光耦,电源隔 ...

我是要程序呀
硬件平台都搭建好了的

使用特权

评论回复
8
小班儿| | 2014-12-19 13:11 | 只看该作者
ycao24 发表于 2014-12-19 09:29
我是要程序呀
硬件平台都搭建好了的

这个!!!百度吧,还是自己写写比较好!!

使用特权

评论回复
9
yaoyuanytu| | 2014-12-19 14:58 | 只看该作者
这个不是很困难,其实还是串口通信的问题。基本思路:配置好串口的基本设置,打开中断。默认先发送给传感器数据,数据发完后等待返回数据,数组存储,数据判断,等待下一次发送和回传数据。

使用特权

评论回复
10
仙人球W| | 2014-12-19 15:07 | 只看该作者
我做过 异步STM32F1与DSP 485通讯

使用特权

评论回复
11
ycao24|  楼主 | 2014-12-19 16:56 | 只看该作者
yaoyuanytu 发表于 2014-12-19 14:58
这个不是很困难,其实还是串口通信的问题。基本思路:配置好串口的基本设置,打开中断。默认先发送给传感器 ...

是呀,就是串口通信。可是我才接触,根本不知道怎么写。您能指导一下嘛

使用特权

评论回复
12
ycao24|  楼主 | 2014-12-19 16:57 | 只看该作者
仙人球W 发表于 2014-12-19 15:07
我做过 异步STM32F1与DSP 485通讯

有程序嘛  能给我参考一下不

使用特权

评论回复
13
仙人球W| | 2014-12-19 17:27 | 只看该作者
这些够用了

void USART_Initial(void)
{
        BYTE i;
        USART_DeInit(USART1);
        USART_StructInit(&USART_InitStructure);
        USART_Init(USART1,&USART_InitStructure);
        USART1->CR1|=0x206c;        //;USART模块使能,允许接收发送,使能USART中断
        USART1->BRR=0x1A0A;//BaudRate;//; //19133  bits/s;
        sentIntervalDelay = 0;
        scisenthead = 0;
        scisentfail = 0;
        for(i=0;i<scisentbuffersize;i++)
                scisentbuffer[i] = Null;
}       

void USART1_IRQHandler(void)     
{
        #define LCD485_Address  0x10
        BYTE  RecTemp;
       
        if(USART1->SR&0x40) //发送
           {
                     USART1->SR&=~0x40;
                     if(SCIStartSent)
               {
                       if(SendCounter<SendBuffer[0])
                                  USART1->DR= SendBuffer[SendCounter++];
                       else
                           {
                                   if(!SCIRece)sentIntervalDelay = 3; // 3ms 完成一循通信稍做延时以便SCI有空闲做下次通信,此种情况专属sentkey
                                //SCIErrorCN=0;
                                    SCISentDis;
                                    SendCounter=0;
                                    SCIStartSent=0;
                                }
                     }
           }

        if(USART1->SR&0x20) //接收
             {
                      RecTemp=USART1->DR;
                       
                      if(AddrEqual==0)
                      {
                       if(RecTemp==LCD485_Address)
                          {
                               AddrEqual=1;  //被正确询址
                               }
                      }
                     else
               {
                       if(SendCounter==0)
                                ReceBuffer[SendCounter++]=RecTemp;  //接收到长度
                         else if(SendCounter<ReceBuffer[0])
                                 ReceBuffer[SendCounter++]=RecTemp;               
                         if(SendCounter==ReceBuffer[0])
                        {
                                 SendCounter=0;  
                                    if(SCIRece)
                              {
                                        SCIRece=0;
                                        //SCIErrorCN=0;
                                        sentIntervalDelay = 3; // 3ms 完成一循通信稍做延时以便SCI有空闲做下次通信
                                       // scisentpnter = Null;
                               }
                                FinishedRece=1;  //完成一帧数据接收
                                AddrEqual=0;
                       }
                     }
     }
}

void Timer1msEvent(void)
{
        ScanSCIsentbuffer();
        if(FinishedRece)
          {
                   AnalyseReceDatas();
                   FinishedRece=0;
          }       
}

/**************************************************************************
分析接收返回的数据信息
***************************************************************************/
void AnalyseReceDatas(void)
{
        WORD Length,CheckSum;
       
        Length=ReceBuffer[0]; /*获取一帧数据长度*/
        CheckSum=(ReceBuffer[Length-1]<<8)+ReceBuffer[Length-2]; /*最后两个为高低校验码*/
        if(CheckSum==CrcValueByteCalc(&ReceBuffer[1],(Length-3)))
        {
                 switch(ReceBuffer[1])
                    {
                             case CommuACK:
                                    SCIReady=1;
                         break;

                         case KeySent:
                               
                         break;
      
                         default:
                        
                         break;
            }
            }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

粉丝