OpenEdv-开源电子网

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

我的毕业设计题目是编写程序实现STM32与昆仑通态触摸屏间的双向数据通信。根据往届已有的论文我编写出了串口中断的程序,见下一。然后昆仑通态触摸屏是支持ModbusRTU协议的

[复制链接]

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-5-26
在线时间
0 小时
发表于 2014-5-26 09:34:33 | 显示全部楼层 |阅读模式
5金钱
我的毕业设计题目是编写程序实现STM32与昆仑通态触摸屏间的双向数据通信。根据往届已有的论文我编写出了串口中断的程序,见下一。然后昆仑通态触摸屏是支持ModbusRTU协议,我又在网上找到了可以应用在STM32上的Modbus RTU可是我不知道怎么把这两个何为一体。求指导!!!!
一,RS485通信程序

void USART_Config(void)

{

  USART_InitTypeDef USART_InitStructure;

  GPIO_InitTypeDef GPIO_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;//利用标志符TypeDef定义结构体

 

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD , ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);


      /* Connect PXx to USARTx_Tx*/

  GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_7);


  /* Connect PXx to USARTx_Rx*/

  GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_7);

     

  /* Configure pins as AF pushpull */

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOD, &GPIO_InitStructure);

     

/* Configure USART Rx as alternate function  */

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOD, &GPIO_InitStructure);

     

     


  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);

     

 

  USART_DeInit(USART2);

  USART_InitStructure.USART_BaudRate = 9600;

  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_Init(USART2, &USART_InitStructure);

 

     

    /* USART enable */

  USART_Cmd(USART2, ENABLE);

  USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);

}

main()

{

      GPIO_InitTypeDef        GPIO_InitStructure;

     

     

  USART_Config();

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;制定为IO口4

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;工作方式为推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;频率为50MHz

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_Init(GPIOD, &GPIO_InitStructure);

  GPIO_ResetBits(GPIOD,GPIO_Pin_4);

      while(1)

      {

                    }

}


u8 RxCounter =0;

u8 TxCounter=0;

u8 RxBufferSize=8;

u8 RxBuffer[64];

void USART2_IRQHandler(void)

{


if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET)  


   {

     RxBuffer[RxCounter++] =(USART_ReceiveData(USART2) & 0x7F);

       USART_ClearITPendingBit(USART2, USART_IT_RXNE); 

     if(RxCounter == RxBufferSize)

     {

        USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);

         GPIO_SetBits(GPIOD,GPIO_Pin_4);                

         USART_ITConfig(USART2, USART_IT_TXE, ENABLE);  

         RxCounter=0;    

      }

}

 

   if(USART_GetITStatus(USART2, USART_IT_TXE) == SET)  

   {

     USART_SendData(USART2, RxBuffer[TxCounter++]);              

      USART_ClearITPendingBit(USART2, USART_IT_TXE);

     if(TxCounter >9)

     {

        USART_ITConfig(USART2, USART_IT_TXE, DISABLE);

         GPIO_ResetBits(GPIOD,GPIO_Pin_4);

         USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

           TxCounter=0;     

      }

     

    }

}


Modbus RTU的程序太大了在附件里面,我觉着不可能全用到。求指导!

用stm32库函数编写的modbus源代码.doc

177.5 KB, 下载次数: 1395

最佳答案

查看完整内容[请看2#楼]

关键是实现数据接收,接收用我们的超时法就很容易解决(参见蓝牙模块等模块的例程),然后就是数据处理了。 论坛最新的XCOM V2.0,支持类Modubus协议传输,里面有参考代码,你可以参考下。 PS:搜索:XCOM。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2014-5-26 09:34:34 | 显示全部楼层
关键是实现数据接收,接收用我们的超时法就很容易解决(参见蓝牙模块等模块的例程),然后就是数据处理了。
论坛最新的XCOM V2.0,支持类Modubus协议传输,里面有参考代码,你可以参考下。
PS:搜索:XCOM。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-5-26
在线时间
0 小时
 楼主| 发表于 2014-5-26 09:36:07 | 显示全部楼层
我是不是还应该在中断函数里面就一段定时器的函数就可以实现Modbus RTU协议通信了。
我想设计的思路是在 触摸屏按下点亮按钮,触摸屏上的灯就亮了,按下熄灭,等灭了。很简单,谁来帮我实现一下!!
有愿意帮助我的可以加我QQ462427140.不胜感激!!!!!!!
回复

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-5-26
在线时间
0 小时
 楼主| 发表于 2014-5-26 11:04:36 | 显示全部楼层
求原子哥解答,求此贴不沉!
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2014-10-8
在线时间
40 小时
发表于 2015-9-21 20:21:04 | 显示全部楼层
我最近也在搞触摸屏485modbus,你搞通了吗,没搞通可以互相探讨哈,搞通了的话麻烦贴下代码,万分感谢
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2015-12-15
在线时间
28 小时
发表于 2016-1-12 14:35:51 | 显示全部楼层
nice把妹 发表于 2015-9-21 20:21
我最近也在搞触摸屏485modbus,你搞通了吗,没搞通可以互相探讨哈,搞通了的话麻烦贴下代码,万分感谢

你搞的怎么样了?  我也在搞,能否讨论哈
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1681
金钱
1681
注册时间
2014-2-25
在线时间
229 小时
发表于 2016-1-14 09:38:20 | 显示全部楼层
这个我之前也搞过。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 00:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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