同比什么意思| 为什么尿频繁怎么回事| 基层是什么意思| 淋病和梅毒有什么区别| 放低姿态是什么意思| 黄瓜不能和什么食物一起吃| 属兔五行属什么| 华妃娘娘是什么电视剧| 万圣节是什么时候| 免疫球蛋白低说明什么| 为什么会嗜睡| 气血虚是什么意思| 蓝莓吃了有什么好处| 胎盘低要注意什么| 1948年是什么年| 夯实是什么意思| npn是什么意思| 山水不相逢什么意思| 小孩吃什么水果好| 目不暇接的意思是什么| 少许纤维灶是什么意思| 状元及第是什么意思| 什么手机像素最高| 心理健康是什么| grn什么颜色| 解说是什么意思| 浸猪笼是什么意思| ipada1474是什么型号| 出现血尿是什么原因| 梦见自己掉头发是什么意思| 下巴脖子长痘痘是什么原因| 空调多少匹什么意思| 紫药水是什么| 见到黑猫代表什么预兆| 排骨烧什么好吃| 容易长痣是什么原因| 外面下着雨犹如我心血在滴什么歌| 罗姓男孩取什么名字好| 肺部真菌感染用什么药最好| vb是什么意思| 什么是慢阻肺| e6是什么意思| 孙尚香字什么| 酸菜鱼是什么地方的菜| 什么叫总胆固醇| 梦到钓鱼是什么意思| 致什么意思| 汗斑是什么原因引起的| 驼背挂什么科| 什么是hpv感染| 牙齿松动是什么原因引起的| 月经老是推后是什么原因| 消肿吃什么药| 女生私密部位长什么样| 黑化是什么意思| 翡翠属于什么五行| 脾肾阴虚有什么症状| 副词是什么| 为什么头会一阵一阵的痛| 老人大小便失禁是什么原因造成的| 为什么生理期不能拔牙| 这个字叫什么| 水肺潜水是什么意思| 呕吐出血是什么原因| 什么的什么好吃| 疰夏是什么意思| 鸡蛋干配什么菜炒好吃| 分家是什么意思| tvb是什么意思| 桃花是指什么生肖| m型发际线适合什么发型| 中性人是什么意思| 关税是什么意思| 后背酸疼是什么原因| 监狱长是什么级别| 星星代表什么生肖| 霍山黄芽属于什么茶| 嘴唇溃疡是什么原因| 头发热是什么原因| 1975年属什么生肖| 一什么眼睛| 6月21是什么星座| 后背凉是什么原因| 10000是什么电话| 四个火读什么字| 死鬼什么意思| 尿酸高会引起什么病| 线差是什么意思| 朱迅和朱军是什么关系| 男性支原体阳性有什么症状| 中心性肥胖什么意思| 牛和什么属相相冲| 吃什么助于睡眠| 中老年喝什么奶粉好| 喝蒲公英根有什么好处| 鼻窦炎是什么原因引起的呢| 遍体鳞伤是什么意思| 姨妈期能吃什么水果| 非常的近义词是什么| 身上出汗多是什么原因| 儿童牙龈肿痛吃什么药| 王玉是什么字| 阴囊潮湿是什么原因| 经常喝柠檬水有什么好处和坏处| 淋巴结发炎挂什么科| 老鼠和什么属相相冲| 什么是法西斯主义| 肌酐低有什么危害| 咳嗽吃什么能治好| 朱元璋为什么不杀汤和| 黑胡椒和白胡椒有什么区别| 吃什么药可以死| 更年期什么时候结束| 小孩舌头白是什么原因| 扁桃体化脓是什么原因引起的| 碳14是检查什么的| 腰间盘膨出吃什么药效果好| 产妇刚生完孩子适合吃什么| 多汗症吃什么药| mark是什么牌子| 什么是k金| 精神小伙什么意思| 梦见和妈妈吵架是什么意思| 什么是前奶什么是后奶| 什么是客单价| 童心未泯什么意思| 血红蛋白低说明什么| 白里透红的透是什么意思| 蔗糖素是什么| 出汗多吃什么| 佯装是什么意思| 为什么放生泥鳅果报大| 无性恋什么意思| 毛峰是什么茶| 蕞是什么意思| 细菌性阴道炎用什么洗液| 睡觉放屁是什么原因| 什么是水中毒| 不作为是什么意思| 什么粉一沾就痒还看不出来| 琼林是什么意思| 樱桃和车厘子有什么区别| 尿结石挂什么科| 尿毒症小便有什么症状| 无舌苔是什么原因| 小狗呕吐是什么原因| 叶酸有什么作用| 宫腔镜是什么| 头晕应该挂什么科| 嘴边长痘痘是什么原因| 睡眠不好挂什么科门诊| 畸胎瘤是什么病严重吗| 手麻脚麻是什么病| 嘴角裂口是什么原因| 麟字五行属什么| 牙齿发黑是什么原因| 不行是什么意思| 什么动物最怕水| wdf是什么意思| 打鼾是什么原因引起的| 舌苔厚白中间有裂纹吃什么药| 预防感冒吃什么药| 老婆的妹妹叫什么| 品种是什么意思| 藩台是什么官| 热辐射是什么| 杨字五行属什么| 肺型p波是什么意思| 蓝朋友什么意思| 崩漏下血是什么意思| 考军校要什么条件| 心血虚吃什么中成药| 精虫上脑是什么意思| 肝脏在什么位置图片| 人生是什么| 烧酒是什么酒| 春天开的花都有什么花| 天亮是什么时辰| 梦见水是什么预兆| 延字五行属什么| 中出是什么意识| 华在姓氏里读什么| 宫腔积液和盆腔积液有什么区别| 乌龟喜欢吃什么食物| 夏天爱出汗是什么原因| 蚯蚓中药叫什么| 农历10月26日是什么星座| 厚黑学讲的是什么| 白癜风是什么| 6月19日是什么日子| 番石榴什么时候成熟| 强迫症吃什么药| 老年人口苦是什么原因| 黄墙绿地的作用是什么| 肾火旺吃什么药| 羊水破了是什么症状| 烧包是什么意思| 黄芪长什么样| 北京立冬吃什么| 年轻人长老年斑是什么原因| 伟字五行属什么| 燃眉之急是什么意思| 口腔溃疡可以吃什么药| 深藏不露是什么意思| 孕妇可以吃什么水果| 补气血吃什么药| 自荐是什么意思| 膝盖骨质增生用什么药效果好| 耳麦是什么| 发烧拉肚子是什么原因| 十月十五号是什么星座| 不疼不痒的红疹是什么| 牙齿疼是什么原因引起的| 什么是飞蚊症| seconds是什么意思| 什么是扬州瘦马| 为什么会有痰| 黄花鱼是什么鱼| 百思不得其解什么意思| 石灰是什么| 梦见和死去的人说话是什么意思| 核医学科是检查什么的| 普通的近义词是什么| 孩子为什么要躲百天| 肾有结晶是什么意思| 淋巴结吃什么药| 过年送什么礼物好| 绅士是什么意思| 泰州有什么好玩的地方| 黄皮肤适合什么颜色的衣服| 骨骼惊奇什么意思| 抱恙是什么意思| 对牛弹琴告诉我们什么道理| 什么什么的太阳| lol锤石什么时候出的| 虚岁31岁属什么生肖| 爱出汗是什么原因女人| 男人更年期在什么年龄| 免疫球蛋白有什么作用| 97年是什么生肖| 左边小腹痛什么原因女| 白露是什么季节的节气| 黑色粑粑是什么原因| 心想事成是什么意思| 心跳和心率有什么区别| 蓝色预警是什么级别| 脑梗什么原因导致的| 张卫健属什么生肖| 鳄鱼吃什么| 积食吃什么| 60岁是什么之年| 明是什么生肖| 山鬼是什么| 吃什么可以解酒| 发烧看什么科| 坐骨神经痛吃什么药快| 心脏支架是什么病| 老年人脚肿挂什么科| 拉黄尿是什么原因| 根管治疗是什么意思| 自讨没趣什么意思| 牛仔蓝配什么颜色好看| 薛之谦的真名叫什么| 杨梅有什么功效与作用| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 高校专区 ? 坤创E-Geek/天科大新电社 ? 【原创】手把手教你移植FreeModbus到STM32(二)

共14条 1/2 1 2 跳转至

【原创】手把手教你移植FreeModbus到STM32(二)

高工
2025-08-04 12:01:20     打赏
百度 新能源汽车产业布局西部,百万辆级汽车项目落户陕西,是汽车产业和区域经济发展的有效结合,也是新的发展机遇。

------------------紧接上一帖----------------

3.01移植freemodbusstm32平台

移植之前需要准备:STM32基础工程(标准库、HAL库均可);FreeModbus Library V1.6;IDE(这里选择常用的MDK);如果需要添加操作系统的,可将STM32的基础工程改为带有操作系统的基础工程,比如常用的FreeRTOS、RT-Thread等。

01.复制正点原子战舰V3库函基础工程,在此工程上添加FreeModbus,先在工程中新建一个Modbus文件,并将freemodbus v1.6下的modbus文件夹下的文件全部复制过来,再将Demo文件夹下的BARE文件夹复制过来,Modbus文件内的具体内容如下:

图片5.png

02.使用MDK打开基础工程,向工程中添加Modbus分组,将Modbus文件夹下对应的文件都添加到Modbus分组中,主要包括:ascii文件夹的mbascii.c文件;function文件夹下的所有.c文件;rtu和tcp文件夹下的.c文件;mb.c文件。添加后的效果如下:

图片6.png

03.添加对应的头文件,工程需要添加以下文件夹:ascii文件夹、BARE/port文件夹、include文件夹、rtu文件夹、tcp文件夹;总之有.h的文件夹统统包含,具体如下:

图片7.png

04.需要对添加过来部分文件进行补充,以完成Modbus对串口和定时器的需要,第一个需要补充的是portserial.c文件,补充Modbus串口发送中断和接收中断使能函数、Modbus串口初始化函数xMBPortSerialInit,具体代码如下:(这里只实现了232功能,没有加485,其实两个代码几乎一致

//该函数实现STM32串口发送中断和接收中断使能
void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
{
//STM32串口 接收中断使能
if(xRxEnable==TRUE) 
{ 
 //使能接收和接收中断
     USART_ITConfig(MODBUS_USART, USART_IT_RXNE, ENABLE);
  } 
else if(xRxEnable == FALSE)
{ 
     //禁止接收和接收中断  
     USART_ITConfig(MODBUS_USART, USART_IT_RXNE, DISABLE);
  }
  //STM32串口 发送中断使能
   if(xTxEnable==TRUE) 
{
     //使能发送完成中断
     USART_ITConfig(MODBUS_USART, USART_IT_TXE, ENABLE);
  } 
else if(xTxEnable == FALSE) 
{
     //禁止发送完成中断
     USART_ITConfig(MODBUS_USART, USART_IT_TXE, DISABLE);
  }
} else if(xTxEnable == FALSE) 
{
     MODBUS_RECIEVE();
     USART_ITConfig(MODBUS_USART, USART_IT_TC, DISABLE);
  }
}
/*******************************************************************/
//对串口进行初始化由eMBRTUInt函数进行调用
BOOL xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 USART_InitTypeDef USART_InitStructure;
 NVIC_InitTypeDef  NVIC_InitStructure;
(void)ucPORT; //不修改串口
   (void)ucDataBits; //不修改数据长度
   (void)eParity; //不许改效验格式
   /***引脚初始化*************************************/
 
   //时钟使能
 RCC_APB2PeriphClockCmd(MODBUS_USART_GPIO_CLK,ENABLE);
 RCC_APB1PeriphClockCmd(MODBUS_USART_CLK,ENABLE);
   //TX
   GPIO_InitStructure.GPIO_Pin = MODBUS_USART_TX_PIN;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
   GPIO_Init(MODBUS_USART_TX_PORT, &GPIO_InitStructure);
   //RX
   GPIO_InitStructure.GPIO_Pin = MODBUS_USART_RX_PIN;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
   GPIO_Init(MODBUS_USART_RX_PORT, &GPIO_InitStructure);
 
  /***************串口初始化********************/
   USART_InitStructure.USART_BaudRate    = ulBaudRate;
   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
   USART_InitStructure.USART_Mode        = USART_Mode_Rx|USART_Mode_Tx;
   USART_InitStructure.USART_Parity      = USART_Parity_No;
   USART_InitStructure.USART_StopBits    = USART_StopBits_1;
   USART_InitStructure.USART_WordLength  = USART_WordLength_8b;
USART_Init(MODBUS_USART, &USART_InitStructure);
   USART_Cmd(MODBUS_USART, ENABLE);
   
   /*****************************中断初始化*************************************/
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 NVIC_InitStructure.NVIC_IRQChannel = MODBUS_USART_IRQ ;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //子优先级0
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
 
 return TRUE;
}
/*******************************************************************/


05.补充串口发送函数和接收函数、中断处理函数,将STM32串口发送函数和接收函数进行封装,供协议栈使用。代码如下:

//串口发送
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(MODBUS_USART, ucByte);  //??????
  while (USART_GetFlagStatus(MODBUS_USART, USART_FLAG_TC) == RESET){}; 
    return 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(MODBUS_USART);  
    return TRUE;
}
/*******************************************************************/
//串口中断处理函数
void MODBUS_USART_IRQHandler(void)
{
   if(USART_GetITStatus(MODBUS_USART, USART_IT_TXE) == SET) 
 {
     prvvUARTTxReadyISR();
     USART_ClearITPendingBit(MODBUS_USART, USART_IT_TXE);
   }
 
   if(USART_GetITStatus(MODBUS_USART, USART_IT_RXNE) == SET) 
 {
     prvvUARTRxISR();
     USART_ClearITPendingBit(MODBUS_USART, USART_IT_RXNE);
   }
}


06.第二个需要补充的是porttimerl.c文件,需要补充的就是Modbus定时器初始化函数、Modbus定时器使能和失能函数,以及Modbus 定时器中断函数。这个对于熟悉stm32编程的就是分分中的事。具体代码如下:

//Modbus定时器初始化函数
BOOL xMBPortTimersInit( USHORT usTim1Timerout50us )
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
   uint16_t PrescalerValue = 0;
//使能定时器4的时钟
RCC_APB1PeriphClockCmd(MODBUS_TIM_CLK, ENABLE); //时钟使能
//定时器4时间配置说明
//HCLK为72MHz,APB1经2分频为36MHz
  //TIM4时钟倍频后为72MHz(硬件自动倍频,达到最大)
  //TIM4的分频系数为3599,时间基频率为:72 / (1 + Prescaler) = 20KHz,基准为50us
  //TIM最大计数值为:usTim1Timerout50u
PrescalerValue = (uint16_t) (SystemCoreClock / 20000) - 1; 
//定时器TIM4初始化
TIM_TimeBaseStructure.TIM_Period = usTim1Timerout50us; 
TIM_TimeBaseStructure.TIM_Prescaler =PrescalerValue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
TIM_TimeBaseInit(MODBUS_TIM, &TIM_TimeBaseStructure); 
//使能预装载
  TIM_ARRPreloadConfig(MODBUS_TIM, ENABLE);
 
//中断优先级NVIC设置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = MODBUS_TIM_IRQ ;  
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure); 
//清除溢出中断标志位
TIM_ClearITPendingBit(MODBUS_TIM, TIM_IT_Update);
//定时器溢出中断关闭
  TIM_ITConfig(MODBUS_TIM,TIM_IT_Update,DISABLE);
//失能定时器
TIM_Cmd(MODBUS_TIM, DISABLE);  
return TRUE;
}
/*******************************************************************/
//Modbus定时器使能函数
void vMBPortTimersEnable()
{
    /* Enable the timer with the timeout passed to xMBPortTimersInit( ) */
 TIM_ClearITPendingBit(MODBUS_TIM, TIM_IT_Update);
   TIM_ITConfig(MODBUS_TIM, TIM_IT_Update, ENABLE);
 //设置定时器的初值
 TIM_SetCounter(MODBUS_TIM,0x0000);
 TIM_Cmd(MODBUS_TIM, ENABLE);
}
/*******************************************************************/
//Modbus定时器失能函数
void vMBPortTimersDisable()
{
  /* Disable any pending timers. */
TIM_ClearITPendingBit(MODBUS_TIM, TIM_IT_Update);
  TIM_ITConfig(MODBUS_TIM, TIM_IT_Update, DISABLE);
  TIM_SetCounter(MODBUS_TIM,0x0000); 
  //关闭定时器
  TIM_Cmd(MODBUS_TIM, DISABLE);
}
/*******************************************************************/
//Modbus 定时器中断函数
void MODBUS_TIM_IRQHandler( void )
{
  if(TIM_GetITStatus(MODBUS_TIM, TIM_IT_Update) == SET) 
{
     TIM_ClearITPendingBit(MODBUS_TIM, TIM_IT_Update);
     prvvTIMERExpiredISR();
   }
}


07.第三个需要修改的文件是port.h文件,这里文件我放置了一些需要定义的宏,方便后面修改,万一哪一天Modbus、串口2、定时器4打起来了,那我有的忙了,一个伟大程序员总是在考虑谁会打起来,不希望出现劝架的那一天。port.h文件中主要补充进入临界区和退出临界区的宏定义、portserial.c 文件中用到的宏、porttimer.c 文件中用到的宏。(注:是补充哦!不是全部的port.h文件内容,不要傻傻的去全部替换!

#define ENTER_CRITICAL_SECTION( )    __set_PRIMASK(1); //关闭中断
#define EXIT_CRITICAL_SECTION( )     __set_PRIMASK(0); //开启中断
//Modbus串口 
#define  MODBUS_USART            USART2
#define  MODBUS_USART_CLK        RCC_APB1Periph_USART2
#define  MODBUS_USART_GPIO_CLK   RCC_APB2Periph_GPIOA
#define  MODBUS_USART_TX_PORT    GPIOA
#define  MODBUS_USART_RX_PORT    GPIOA
#define  MODBUS_USART_TX_PIN     GPIO_Pin_2
#define  MODBUS_USART_RX_PIN     GPIO_Pin_3
#define  MODBUS_USART_IRQ           USART2_IRQn
#define  MODBUS_USART_IRQHandler    USART2_IRQHandler
//Modbus定时器
#define  MODBUS_TIM              TIM4      
#define  MODBUS_TIM_CLK          RCC_APB1Periph_TIM4
#define  MODBUS_TIM_IRQ          TIM4_IRQn
#define  MODBUS_TIM_IRQHandler   TIM4_IRQHandler


08.编译之后,果然不出所料,有错误。学会修改错误,是一个程序猿的基本修养。如果连这点基本修养都没有,那只能说,路漫漫其修远兮,还得继续上下左右之求索。在这里我们尝试着去删除porttimer.c 中定时器使能和失能函数前的inline 字样,咦,奇怪的东西消失了呢。

图片8.png

09.当然困难不止一个,就像当前的新冠病毒,一波未平一波又起。再次编译,出现关于assert的错误...........,不要挠头皮,继续想法搞定吧!于是打开搜索引擎,开始找对应的解决办法的过程。

图片9.png

10. 搜索并思考了很久,偶然在CSDN上看到一位博主是这么解决的:在主函数下面添加以下代码(代码在下方),即可解决以上问题,硬着头皮先试一试(因为暂时不相信也没有其它办法),复制过来,直接编译,居然轻松解决,至于原因嘛,就留给各位读者自己思索咯。

#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


好了各位小伙伴,到这里FreeModbus已经移植到STM32平台上了,下一步就是测试验证移植的FreeModbus是否可以正常通讯。(验证方式和全部代码下载,请见下一帖)

----未完待续----       等你来哦





关键词: FreeModbus     移植     STM32     Modbu    

管理员
2025-08-04 15:50:31     打赏
2楼

祝老师,代码可以用下面这个文本框试试

按钮在工具栏的【代码语言】

比如,截取一部分

void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
{
//STM32串口 接收中断使能
if(xRxEnable==TRUE)
{
 //使能接收和接收中断
     USART_ITConfig(MODBUS_USART, USART_IT_RXNE, ENABLE);
  }
else if(xRxEnable == FALSE)
{
     //禁止接收和接收中断  
     USART_ITConfig(MODBUS_USART, USART_IT_RXNE, DISABLE);
  }
......

院士
2025-08-04 10:22:44     打赏
3楼

我觉得 祝老师这个代码框挺好看的


专家
2025-08-04 21:52:50     打赏
4楼

文字写的轻松又有内涵,赞



菜鸟
2025-08-04 21:10:27     打赏
5楼

这里第一个代码区。大括号多了一个。

  1. //该函数实现STM32串口发送中断和接收中断使能  

  2. void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )  

  3. {  

  4. //STM32串口 接收中断使能  

  5. if(xRxEnable==TRUE)   

  6. {   

  7.  //使能接收和接收中断  

  8.      USART_ITConfig(MODBUS_USART, USART_IT_RXNE, ENABLE);  

  9.   }   

  10. else if(xRxEnable == FALSE)  

  11. {   

  12.      //禁止接收和接收中断    

  13.      USART_ITConfig(MODBUS_USART, USART_IT_RXNE, DISABLE);  

  14.   }  

  15.   //STM32串口 发送中断使能  

  16.    if(xTxEnable==TRUE)   

  17. {  

  18.      //使能发送完成中断  

  19.      USART_ITConfig(MODBUS_USART, USART_IT_TXE, ENABLE);  

  20.   }   

  21. else if(xTxEnable == FALSE)   

  22. {  

  23.      //禁止发送完成中断  

  24.      USART_ITConfig(MODBUS_USART, USART_IT_TXE, DISABLE);  

  25.   }  

  26. else if(xTxEnable == FALSE)   

  27. {  

  28.      MODBUS_RECIEVE();  

  29.      USART_ITConfig(MODBUS_USART, USART_IT_TC, DISABLE);  

  30.   }  

  31. }  



菜鸟
2025-08-04 15:22:56     打赏
6楼

真不错!


菜鸟
2025-08-04 21:44:13     打赏
7楼

哈喽!文章很不错,能发一下这个工程么,谢谢了


专家
2025-08-04 21:46:43     打赏
8楼

看看  


菜鸟
2025-08-04 07:55:37     打赏
9楼

请教老师:

MODBUS_RECIEVE()

这个函数的实现在哪里?


助工
2025-08-04 08:28:55     打赏
10楼

谢谢分享


共14条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
阿魏是什么中药 什么叫过渡句 牛跟什么生肖相冲 规格是什么 白细胞十一是什么意思
中老年吃什么钙片比较好 肺结节挂什么科室 白肉是指什么肉 上颚痒是什么原因 适得其反是什么意思
向内求什么意思 世界上最小的花是什么花 驻马店以前叫什么名字 割掉胆对人有什么影响 苦瓜有什么营养
1997年属什么 子宫脱垂吃什么药怎么恢复正常 三庭五眼是什么意思 子宫内膜厚有什么影响 避孕套和安全套有什么区别
什么时候解放台湾hcv9jop6ns3r.cn 白脉病是什么病hcv8jop4ns4r.cn 旨在是什么意思hcv9jop3ns5r.cn 百香果有什么功效与作用hcv8jop2ns3r.cn 海参和辽参有什么区别hcv9jop2ns1r.cn
02年的马是什么命hcv7jop9ns2r.cn 三叉神经痛用什么药bjhyzcsm.com 4月6日什么星座hcv8jop6ns0r.cn 石榴花是什么季节开的hcv8jop2ns8r.cn 除权是什么意思hcv8jop2ns0r.cn
吃什么补维生素b6hcv7jop9ns3r.cn 最高位是什么位hcv8jop4ns2r.cn 犹太人什么意思hcv7jop5ns5r.cn 吃东西容易呛到是什么原因hcv7jop5ns1r.cn 反应性增生是什么意思hcv9jop4ns7r.cn
孟买血型是什么意思hcv7jop4ns8r.cn 1994年属什么inbungee.com 房性早搏吃什么药最好hcv9jop7ns2r.cn 东盟是什么意思hcv8jop3ns3r.cn 肺部积水是什么原因引起的hcv9jop7ns4r.cn
百度