OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 126346|回复: 318

FreeModbus在STM32上移植

  [复制链接]

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-3-7 22:06:34 | 显示全部楼层 |阅读模式
本帖最后由 八度空间 于 2016-3-8 08:18 编辑

前段时间了解了一下Modbus协议,移植了一次,不成功http://www.openedv.com/thread-67471-1-1.html,不过找到方法之后,再次完善
在官网上面下载源码,度娘上面有些被人家修改过的,喜欢原汁原味的朋友去官网上下载,本贴附件也附上源码

开发平台:原子哥探索者开发板V2.2
编译环境:MDK5.17
STM32官方库函数:V1.5.1
FreeModbu版本:V1.5.0

一、解压源码后,看到文件目录结构
FreeModbus_1.png
文件夹demo就是官方针对不同平台移植的测试代码
文件夹doc是一些说明性文档
文件夹modbus就是功能实现的源码所在了
文件夹tools是上位机软件

二、建立工程
2.1、新建一个工程(这个就随意了),建立文件夹FreeModbus,将上面提到的modbus文件夹整个拷贝到工程的FreeModbus文件夹中
FreeModbus_2.png
2.2、进入demo文件夹,看到有各个平台的测试代码文件夹,没看到STM32的,但是看到BARE这个不带任何平台的代码文件,将里边的port文件夹拷贝到FreeModbus文件夹中
FreeModbus_3.png
2.3、打开MDK(用IAR也行,随意了),建立工程。。。(省略1万字)

三、添加代码
3.1、打开portserial.c文件,这个是移植串口的,不管是ASCII模式还是RTU模式都需要串口支持的,void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )函数,使能或失能串口的,移植代码如下
[mw_shl_code=applescript,true]void
vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
{
    /* If xRXEnable enable serial receive interrupts. If xTxENable enable
     * transmitter empty interrupts.
     */
        
        if (xRxEnable)  //接收使能
        {
                USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);  //使能接收中断
                GPIO_ResetBits(GPIOG, GPIO_Pin_8);  //接收
        }
        else  //失能
        {
                USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);  //失能接收中断
                GPIO_SetBits(GPIOG, GPIO_Pin_8);  //恢复发送
        }
        
        if (xTxEnable)  //发送使能
        {
                USART_ITConfig(USART2, USART_IT_TC, ENABLE);  //使能
                GPIO_SetBits(GPIOG, GPIO_Pin_8);  //发送
        }
        else  //失能
        {
                USART_ITConfig(USART2, USART_IT_TC, DISABLE);  //失能
                GPIO_ResetBits(GPIOG, GPIO_Pin_8);  //设置接收
        }
}[/mw_shl_code]
3.1.1、串口初始化函数BOOL xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity ),使用的是串口2进行通讯
[mw_shl_code=applescript,true]BOOL
xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
{
//    return FALSE;
        
        GPIO_InitTypeDef  GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef  NVIC_InitStructure;
        
        (void)ucPORT;  //不修改串口号
        (void)ucDataBits;  //不修改数据位长度
        (void)eParity;  //不修改检验格式
        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOG, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
        
        //
        //管脚复用
        //
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
        
        //
        //发送管脚 PA.02
        //接收管脚 PA.03
        //
        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2 | GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        //
        //485芯片发送接收控制管脚
        //
        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(GPIOG, &GPIO_InitStructure);
        
        //
        //配置串口参数
        //
        USART_InitStructure.USART_BaudRate            = ulBaudRate;  //只修改波特率
        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_Parity              = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART2, &USART_InitStructure);
        //
        //使能串口
        //
        USART_Cmd(USART2, ENABLE);
        
        //
        //配置中断优先级
        //
        NVIC_InitStructure.NVIC_IRQChannel                   = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        return TRUE;
}[/mw_shl_code]
3.1.2、发送一个字节函数BOOL xMBPortSerialPutByte( CHAR ucByte )
[mw_shl_code=applescript,true]BOOL
xMBPortSerialPutByte( CHAR ucByte )
{
    /* Put a byte in the UARTs transmit buffer. This function is called
     * by the protocol stack if pxMBFrameCBTransmitterEmpty( ) has been
     * called. */
   
        USART_SendData(USART2, ucByte);  //发送一个字节
        
        return TRUE;
}[/mw_shl_code]
3.1.3、接收一个字节函数BOOL xMBPortSerialGetByte( CHAR * pucByte )
[mw_shl_code=applescript,true]BOOL
xMBPortSerialGetByte( CHAR * pucByte )
{
    /* Return the byte in the UARTs receive buffer. This function is called
     * by the protocol stack after pxMBFrameCBByteReceived( ) has been called.
     */
   
        *pucByte = USART_ReceiveData(USART2);  //接收一个字节
        
        return TRUE;
}[/mw_shl_code]
3.1.4、串口中断服务函数void USART2_IRQHandler(void)
[mw_shl_code=applescript,true]/**
  *****************************************************************************
  * @Name   : 串口2中断服务函数
  *
  * @Brief  : none
  *
  * @Input  : none
  *
  * @Output : none
  *
  * @Return : none
  *****************************************************************************
**/
void USART2_IRQHandler(void)
{
        if (USART_GetITStatus(USART2, USART_IT_RXNE) == SET)  //接收中断
        {
                prvvUARTRxISR();
                USART_ClearITPendingBit(USART2, USART_IT_RXNE);
        }
        
        if (USART_GetITStatus(USART2, USART_IT_TC) == SET)  //发送中断
        {
                prvvUARTTxReadyISR();
                USART_ClearITPendingBit(USART2, USART_IT_TC);
        }
}[/mw_shl_code]
3.2、打开porttimer.c文件,RTU模式需要定时器支持,定时器初始化函数BOOL xMBPortTimersInit( USHORT usTim1Timerout50us )
[mw_shl_code=applescript,true]BOOL
xMBPortTimersInit( USHORT usTim1Timerout50us )
{
//    return FALSE;
        
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        NVIC_InitTypeDef        NVIC_InitStructure;
        
        uint16_t PrescalerValue = 0;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        
        //
        //HCLK为72MHz
        //时基频率72 / (1 + Prescaler) = 20KHz
        //
        PrescalerValue = (uint16_t)((SystemCoreClock / 20000) - 1);
        //
        //初始化定时器参数
        //
        TIM_TimeBaseStructure.TIM_Period = (uint16_t)usTim1Timerout50us;
        TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
        //
        //使能预装
        //
        TIM_ARRPreloadConfig(TIM2, ENABLE);
        
        //
        //初始化中断优先级
        //
        NVIC_InitStructure.NVIC_IRQChannel                   = TIM2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
        TIM_Cmd(TIM2, DISABLE);
        
        return TRUE;
}[/mw_shl_code]
3.2.1、定时器使能函数void vMBPortTimersEnable(  )
[mw_shl_code=applescript,true]void
vMBPortTimersEnable(  )
{
    /* Enable the timer with the timeout passed to xMBPortTimersInit( ) */
        
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
        TIM_SetCounter(TIM2, 0x00000000);
        TIM_Cmd(TIM2, ENABLE);
}[/mw_shl_code]
3.2.2、定时器失能函数void vMBPortTimersDisable(  )
[mw_shl_code=applescript,true]void
vMBPortTimersDisable(  )
{
    /* Disable any pending timers. */
        
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
        TIM_SetCounter(TIM2, 0x00000000);
        TIM_Cmd(TIM2, DISABLE);
}[/mw_shl_code]
3.2.3、定时器中断服务函数void TIM2_IRQHandler(void)
[mw_shl_code=applescript,true]/**
  *****************************************************************************
  * @Name   : 定时器4中断服务函数
  *
  * @Brief  : none
  *
  * @Input  : none
  *
  * @Output : none
  *
  * @Return : none
  *****************************************************************************
**/
void TIM2_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
                prvvTIMERExpiredISR();
        }
}[/mw_shl_code]
四、打开port.c文件,这个文件我是从别的工程拷贝过来的
4.1、补充完成以下两个函数,这两个函数跟中断有关,开或者关
[mw_shl_code=applescript,true]void
EnterCriticalSection(  )
{
        __ASM volatile("cpsid i");
}

void
ExitCriticalSection(  )
{
    __ASM volatile("cpsie i");
}[/mw_shl_code]
4.2、定义相关寄存器地址什么的,详细看工程文件
4.3、分别完善一下函数
4.3.1、操作输入寄存器eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
4.3.2、操作保持寄存器eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
4.3.3、操作线圈eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
4.3.4、操作离散寄存器eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
4.4、打开port.h文件,完善两个宏定义
4.4.1、#define ENTER_CRITICAL_SECTION( )也可以空着
4.4.2、#define EXIT_CRITICAL_SECTION( )
五、编写main函数
[mw_shl_code=applescript,true]/**
  *****************************************************************************
  * @Name   : 主函数
  *
  * @Brief  : none
  *
  * @Input  : none
  *
  * @Output : none
  *
  * @Return : none
  *****************************************************************************
**/
int main( void )
{
        u8 i = 0;
        
        //
        //初始化硬件
        //
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init();
        uart_init(38400);
        LED_Init();
        
        usmart_dev.init(72);
        
        LCDTFT_Init();

    eMBInit(MB_RTU, 0x0A, 1, 38400, MB_PAR_NONE);  //初始化FreeModbus

    eMBEnable();  //启动FreeModbus
        
        LCD_ShowString(30, 50, 480, 24, 24, "FreeModbus Test.");
        
        while (1)
    {
        (void)eMBPoll();  //查询数据帧
               
        usRegInputBuf[0]++;  //测试读取输入寄存器用
               
                if (usRegInputBuf[0] > 250)  //防止超标
                {
                        usRegInputBuf[0] = 0;
                }
               
                delay_ms(10);
                i++;
                if (i >= 50)
                {
                        i = 0;
                        LED0 = !LED0;
                }
    }
}[/mw_shl_code]
为了测试我将输入寄存器在while循环中加1
六、编译,问题来了,提示错误
FreeModbus_4.png
FreeModbus作者使用了assert这货,各种百度,说什么乱七八糟的,没解决什么问题,最后还是自己解决了http://www.openedv.com/thread-67471-1-1.html
在main函数最后增加代码
[mw_shl_code=applescript,true]#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */  
void assert_failed(uint8_t* file, uint32_t line)  
{  
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */  
   
  /* Infinite loop */  
  while (1)  
  {  
  }  
}
#else
void __aeabi_assert(const char * x1, const char * x2, int x3)
{
}
#endif[/mw_shl_code]
再次编译,发现没错误了,下载到板子上面运行,用串口助手(Modbus调试精灵也行)发送命令0A 04 00 01 00 01 61 71读取输入寄存器,发现没返回数据,各种仿真之后,发现串口中断的问题,前面初始化使用了TC,发送完成中断,打开手册看到了TXE这个,修改编译下载,再次发送命令,这回有返回了,不过数据不对,返回0
在eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )函数中将usAddress变量显示到液晶上面一看,不对,比发送的地址多了1,跳转到函数eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen )一看,解释之后来了一句usRegAddress++;,赶紧注释掉,再来,这回对了
接着测试其他的,也发现了最后操作的地址比发送过去的地址多了1,又打开相关的函数文件,都是在地址解释之后有usRegAddress++;这句存在,赶紧注释掉,再来,这回正确了
七、回到刚才的串口发送中断标志TC和TXE的问题上来,对照手册一看
FreeModbus_5.png
大家对比一下说明,我就不解释了
打开mbrtu.c文件,在下面位置增加一段代码,修正TC中断标志发送的错误
FreeModbus_6.png
如果大家不想修改源码的话就用TXE这个标志,不过增加了以上代码再使用TXE标志也是没有问题的,无所谓了
好了到此为止,移植算是完成了,继续深究的朋友可以接着,否则就直接用吧


附件上传我调试用到的工具软件

FreeModbus_M4.zip

1.07 MB, 下载次数: 13296

CRC16jymjsq_gr.zip

488.33 KB, 下载次数: 5179

uart_qm999cn.zip

343.41 KB, 下载次数: 5448

freemodbus-v1.5.0.zip

4.16 MB, 下载次数: 10217

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-12-19
在线时间
307 小时
发表于 2016-6-14 16:35:53 | 显示全部楼层
八度空间 发表于 2016-6-14 09:01
你发送新行干啥?????

搞定了,提供的工程里面没加void __aeabi_assert(const char * x1, const char * x2, int x3){}这段代码,就是你另一个帖子里的,我把这段代码加到main里,然后发送就收到数据了
QQ截图20160614163453.png
回复 支持 1 反对 1

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-8-1 23:43:24 | 显示全部楼层
solo 发表于 2016-8-1 09:32
。。。我把重定义的重写了一个文件,port理应合并在一起,但是怕移植性变差(耦合),就重命名了。这样把 ...

呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 2 反对 0

使用道具 举报

55

主题

1231

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2624
金钱
2624
注册时间
2014-2-13
在线时间
514 小时
发表于 2016-3-7 23:19:55 | 显示全部楼层
八度大神的帖子,必须来顶!
技术交流,Sell 中颖单片机,欢迎私信骚扰
回复 支持 1 反对 1

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2014-12-8
在线时间
104 小时
发表于 2016-10-8 21:18:44 | 显示全部楼层
起舞弄清影 发表于 2016-10-8 21:00
这。。。要不是你我永远都发现不了这个错误。。。我改好了以后串口可以收到数据了,但是貌似不对。。。。

STM32上的ModBus从机的移植.rar (560.7 KB, 下载次数: 975)
回复 支持 1 反对 0

使用道具 举报

8

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2016-1-6
在线时间
87 小时
发表于 2017-6-21 10:20:21 | 显示全部楼层
八度空间 发表于 2017-6-20 23:06
不会吧,我这边正常喔

可以了,参考了这个帖子解决了,不知道是什么奇怪的问题
http://blog.sina.com.cn/s/blog_1310779960102vdq7.html
回复 支持 1 反对 0

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2018-9-21
在线时间
5 小时
发表于 2018-10-5 13:39:22 | 显示全部楼层
你好,怎么用这个发送自己想要的数据饿,比如说一个温度什么的
回复 支持 1 反对 0

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2013-11-21
在线时间
42 小时
发表于 2016-7-22 20:33:39 | 显示全部楼层
测试了下能用,好不好用就没有这水平检测了。

uCOS-III_FreeMODBUS.zip

8.33 MB, 下载次数: 15725

回复 支持 1 反对 0

使用道具 举报

49

主题

340

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5246
金钱
5246
注册时间
2012-8-25
在线时间
1024 小时
发表于 2020-5-14 15:11:17 | 显示全部楼层
简直太好了
回复 支持 1 反对 0

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-3-9 22:40:19 | 显示全部楼层
正点原子 发表于 2016-3-9 21:52
八度又搞好资料了

感谢原子哥!!!
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 0 反对 1

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-8-4 11:46:23 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-3-8 08:52:20 | 显示全部楼层
brilliant,赞
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
发表于 2016-3-8 08:59:39 | 显示全部楼层
前一段时间也移植了这个,赞一个
活着才是王道!健康是一切的前提!
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2016-3-8 10:07:34 | 显示全部楼层
感谢分享了!!!!!!
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

4

主题

102

帖子

0

精华

高级会员

Rank: 4

积分
900
金钱
900
注册时间
2013-8-28
在线时间
114 小时
发表于 2016-3-9 13:00:56 | 显示全部楼层
谢谢分享,原来还有专门的API函数,以前都是自己写的协议
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-3-9 19:59:42 | 显示全部楼层
geo 发表于 2016-3-9 13:00
谢谢分享,原来还有专门的API函数,以前都是自己写的协议

呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-3-9 21:52:54 | 显示全部楼层
八度又搞好资料了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-3-9 22:40:29 | 显示全部楼层
正点原子 发表于 2016-3-9 21:52
八度又搞好资料了

感谢原子哥!!!
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-9-11
在线时间
12 小时
发表于 2016-3-13 19:29:42 | 显示全部楼层
正在学习中
回复 支持 反对

使用道具 举报

9

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2014-3-2
在线时间
2 小时
发表于 2016-3-14 13:32:07 | 显示全部楼层
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-3-14 19:41:55 | 显示全部楼层
今天突然发现一个问题,串口使用TXE标志的问题,会漏掉一个字节没发送出来
modbus调试丢数据.jpg
后面改成TC标志就没问题了,改为TC标志之后,要修改一下源码,详细见楼主位
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-7-8
在线时间
7 小时
发表于 2016-3-20 11:54:42 | 显示全部楼层
正在搜集这方面的资料,MARK一下!
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2016-1-21
在线时间
20 小时
发表于 2016-3-21 13:28:38 | 显示全部楼层
八度大神很厉害
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-3-21 19:43:10 | 显示全部楼层

打酱油的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-1-14
在线时间
6 小时
发表于 2016-4-3 11:30:06 | 显示全部楼层
为什么基本都没有人用到dma?来做?我老师叫我用stm32cube 的库函数去做,更加没人做过。了
回复 支持 反对

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3761
金钱
3761
注册时间
2015-4-26
在线时间
761 小时
发表于 2016-4-13 17:58:16 来自手机 | 显示全部楼层
freemodbus标记学习,谢谢分享
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-3-3
在线时间
2 小时
发表于 2016-4-20 09:44:36 | 显示全部楼层
我也用开发板下载了你的代码,发送了没有返回啊
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-3-3
在线时间
2 小时
发表于 2016-4-20 11:39:25 | 显示全部楼层
yhx立夏 发表于 2016-4-20 09:44
我也用开发板下载了你的代码,发送了没有返回啊

可以用的,我错了。谢谢分享
回复 支持 反对

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2016-5-3 17:55:31 | 显示全部楼层
你真牛    有需要或者有空的时候再来看看
合肥-文盲
回复 支持 反对

使用道具 举报

29

主题

311

帖子

0

精华

高级会员

Rank: 4

积分
747
金钱
747
注册时间
2016-5-21
在线时间
199 小时
发表于 2016-6-1 10:39:40 | 显示全部楼层
大神膜拜中
回复 支持 反对

使用道具 举报

80

主题

268

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2014-8-11
在线时间
84 小时
发表于 2016-6-2 18:20:55 | 显示全部楼层
6得一比,必须要提高一个品味了,八度搞基?
我是一只菜鸟,但我会大鹏展翅
回复 支持 反对

使用道具 举报

80

主题

268

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2014-8-11
在线时间
84 小时
发表于 2016-6-2 18:25:22 | 显示全部楼层
八度针对modbus协议在stm32上的移植,mark一下
我是一只菜鸟,但我会大鹏展翅
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-6-2 21:31:18 | 显示全部楼层
战舰水手 发表于 2016-6-2 18:20
6得一比,必须要提高一个品味了,八度搞基?

搞妹可以么?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

4

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2016-5-19
在线时间
30 小时
发表于 2016-6-3 15:27:38 | 显示全部楼层
好东西,顶!
回复 支持 1 反对 0

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2013-11-21
在线时间
42 小时
发表于 2016-6-11 07:32:40 | 显示全部楼层
有没有FreeRTOS+FreeModBus
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-6-12 10:49:57 | 显示全部楼层
newphj 发表于 2016-6-11 07:32
有没有FreeRTOS+FreeModBus

暂时没用RTOS,所以没有,可以尝试移植一下,顺便分享一下经验吧,我最近没空
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

14

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-12-19
在线时间
307 小时
发表于 2016-6-12 21:05:03 | 显示全部楼层
yhx立夏 发表于 2016-4-20 11:39
可以用的,我错了。谢谢分享

能不能问你一下,你是怎么测试的,我把代码下载到探索者上面,是不是开发板的USB_232口一端与PC机的串口调试助手相连,USB_232的另一端(P6 RXD TXD)与P9(PA2 PA3)相连,串口调试助手发送指令0A 04 00 01 00 01 61 71;请问一下是不是这么操作的呀
回复 支持 反对

使用道具 举报

14

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-12-19
在线时间
307 小时
发表于 2016-6-13 18:14:36 | 显示全部楼层
八度大神,问一下,怎么测试你这个代码啊,我用的探索者,板子上的USB_232口一端接电脑,一端接PA2 PA3,电脑发送0A 04 00 01 00 01 61 71,没收到东西呀,能不能指导一下啊,万分感激
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-6-13 21:35:56 | 显示全部楼层
shiqinghai 发表于 2016-6-13 18:14
八度大神,问一下,怎么测试你这个代码啊,我用的探索者,板子上的USB_232口一端接电脑,一端接PA2 PA3,电 ...

恩,十六进制方式发送
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

14

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-12-19
在线时间
307 小时
发表于 2016-6-13 21:52:23 | 显示全部楼层
八度空间 发表于 2016-6-13 21:35
恩,十六进制方式发送

大神啊,完全没有反应呀
QQ图片20160613215138.png
回复 支持 反对

使用道具 举报

7

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2015-12-2
在线时间
25 小时
发表于 2016-6-14 09:00:52 | 显示全部楼层
太强悍了!
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-6-14 09:01:37 | 显示全部楼层
shiqinghai 发表于 2016-6-13 21:52
大神啊,完全没有反应呀

你发送新行干啥?????
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2013-7-5
在线时间
107 小时
发表于 2016-6-15 14:56:14 | 显示全部楼层
最近在搞Modbus。问一下,这个支持主站么?
回复 支持 反对

使用道具 举报

14

主题

76

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1422
金钱
1422
注册时间
2015-12-22
在线时间
325 小时
发表于 2016-6-15 19:02:05 | 显示全部楼层
好东西
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-6-16 13:38:49 | 显示全部楼层
kanwoe 发表于 2016-6-15 14:56
最近在搞Modbus。问一下,这个支持主站么?

不支持
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

11

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
492
金钱
492
注册时间
2015-3-3
在线时间
114 小时
发表于 2016-7-3 17:25:06 | 显示全部楼层
过来学习一下
回复 支持 反对

使用道具 举报

18

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2012-8-27
在线时间
21 小时
发表于 2016-7-22 15:04:34 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-7-23 09:22:22 | 显示全部楼层
newphj 发表于 2016-7-22 20:33
测试了下能用,好不好用就没有这水平检测了。

上系统拉
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

18

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-7-28
在线时间
7 小时
发表于 2016-7-29 18:04:51 | 显示全部楼层
标注一下,改天定能用上
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-7-30 11:23:27 | 显示全部楼层
移植多个中间件程序时重名怎么处理
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-7-31 15:16:09 | 显示全部楼层
solo 发表于 2016-7-30 11:23
移植多个中间件程序时重名怎么处理

哪个重名了?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-8-1 08:11:21 | 显示全部楼层

1、port文件出现了重名,在FreeRTOS和FreeModbus都存在
2、重定义,FAT_FS的integer.h和FreeModbus的port.h
重定义变量:
typedef unsigned char UCHAR;
typedef char CHAR;

typedef uint16_t USHORT;
typedef int16_t SHORT;

typedef uint32_t ULONG;
typedef int32_t LONG;
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-8-1 08:57:55 | 显示全部楼层
solo 发表于 2016-8-1 08:11
1、port文件出现了重名,在FreeRTOS和FreeModbus都存在
2、重定义,FAT_FS的integer.h和FreeModbus的por ...

那就选择屏蔽一个呗,选择另外一个就是了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-8-1 09:32:19 | 显示全部楼层
八度空间 发表于 2016-8-1 08:57
那就选择屏蔽一个呗,选择另外一个就是了

。。。我把重定义的重写了一个文件,port理应合并在一起,但是怕移植性变差(耦合),就重命名了。这样把源文件都改了一个遍。。。
回复 支持 反对

使用道具 举报

0

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2016-7-5
在线时间
43 小时
发表于 2016-8-3 09:25:34 | 显示全部楼层
学习了,谢谢楼主分享!!赞!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 11:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表