OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 我写ModbusOnSTM32之二:基础的串口通信程序

共16条 1/2 1 2 跳转至

我写ModbusOnSTM32之二:基础的串口通信程序

高工
2013-03-05 21:02:49    评分

今晚有点事,没写程序。先把思路放着这里摆着。

乔布斯大人看见了,指点指点俺再下键盘。

我先做的是modbus 的 RTU部分。MCU向PC机发送modbus帧,PC端使用modbus测试工具接受这段数据。

最初发送的数据,只是一个简单的开关线圈的帧。如果能在PC端显示出来,说明思路没问题。

1、定义一个BUF:8字节,分别存放固定的从站地址、功能码、其实地址高低位、数据线圈高低位、CRC高低位。

2、通过串口将这个数据到PC端,通过MODBUS Slave这个软件查看,是不是与期望的一致。

3、如果一致,说明思路没问题。继续完善,将数据变成可设置的数据。然后做成一个不纯软件的函数供调用。

4、实现别的功能。


我没有写过像样的代码,头一次比较难下键盘。。。。头疼





关键词: 我写     ModbusOnSTM32     之二     基础     串口    

高工
2013-03-05 21:04:33    评分
2楼
很久很久都没写代码了,拿出来STM32的板子折腾一晚上才弄出来这么点东西。
看来是老了,忘性比记性好。
不过还好,参考这以前的代码串口发送数据今天是搞定了。
modbus协议里边接收数据怎么定义还没想好。代码也没出来
两个文件,.h和.c。如下:

/*
        文件名:usart.h
        作者  :hanshuyujifen2
        创建日期:2013.03.06
        描述:  串口头文件
*/
#include "stm32f10x.h"
#include "stdio.h"

void MB_USART_Init(void);
void MB_USART_SendData(char ch);
void MB_USART_SendString(char* s,int len);
void USART_Gpio_Init(void);



/*
        文件名:usart.c
        作者  :hanshuyujifen2
        创建日期:2013.03.06
        描述:  串口发送/接收数据程序
*/
#include "usart.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef  GPIO_InitStructure;

//串口1初始化
void MB_USART_Init(void)
{
    //USART_DeInit(USART1);
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    
    USART_Gpio_Init();
    
    USART_Init(USART1,&USART_InitStructure);
    USART_Cmd(USART1,ENABLE);
    }
//发送单个字符    
void MB_USART_SendData(char ch)
{
    //先查看状态再发送数据。否则容易丢掉第一个数据
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}
    USART_SendData(USART1,ch);
    
}
//发送字符串
void MB_USART_SendString(char* s,int len)
{
    int i;
    for(i=0;i<len;i++)
    {
        MB_USART_SendData(s[i]);
    }
    }

//USART1 的GPIO配置    
void USART_Gpio_Init(void)
{
    //USART1时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
    //引脚配置,PA9 TX 推挽复用输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    //引脚配置,PA10 RX   浮空输入
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}    

    
    
    
    
    
    


专家
2013-03-05 21:46:41    评分
3楼

应该先看一下modbus rtu的帧格式。其是一个事实的标准,帧格式是固定的。


军爷 明天把你现在找到的文献资料先做一个list呗


高工
2013-03-05 22:32:14    评分
4楼
这个我知道。现在只有一个地方没解决。 比如读线圈,线圈数目是可变的。mcu接收部分怎样定义这个可变的数据长度?

高工
2013-03-06 12:13:15    评分
5楼

我的Modbus资料。



专家
2013-03-06 13:49:40    评分
6楼
资料挺多的。我估计那个协议与资料灰常重要

高工
2013-03-06 21:12:55    评分
7楼

真正的modbus协议还没开始写呢。

今天刚弄了串口收发数据。解决了丢掉第一个数据的问题。


高工
2013-03-07 20:19:58    评分
8楼
计划使用中断方式接收数据。
今天弄中断部分的时候悲剧了。弄了半天死活进不了中断。
串口中断使用USART_ITConfig()函数打开了,中断处理函数写好了:void USART1_IRQHandler(void);

可就是进不去。最后还是参考原来的程序,发现NVIC没打开。真是三天不练手生啊。这么简单的问题竟然卡住了。
加入NVIC配置函数,顺利进入中断。代码如下:
void NVIC_Configuration(void)
{
    ..........................
        ..........................
    /* 使能串口中断 */
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;        //USART1中断
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        //
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
}

串口接收终端函数只需在stm32f10x_it.c里边加入中断响应函数就可以了:
void USART1_IRQHandler(void)
{
        while(1);
}
只要进中断就可以了。剩下的交给接收部分。

今天到此为止,还得多练习啊。

总结串口的收发初始化要使用的几个库函数:
1、串口的初始化:USART_Init
2、串口引脚时钟开启:RCC_APB2PeriphClockCmd().
3、串口的两个引脚GPIO的配置:GPIO_Init()
4、NVIC里边开启串口中断:NVIC_Init()

专家
2013-03-07 22:58:29    评分
9楼

有意思~~


持续围观


工程师
2013-03-20 08:41:34    评分
10楼
我也在弄这个协议,到时候有不会的请教你

共16条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]