qq_54098011 2024-07-16 13:38 采纳率: 0%
浏览 4

UART转RS485通信代码求解答

对CMS8S6990的串口通信例程修改,想改成RS485的通信,只添加了对RS485方向控制的引脚,并修改了串口中断部分,不知道问题出在哪里,串口软件发出后,收不到信息,修改或添加的代码如下:

     GPIO_SET_MUX_MODE(P24CFG,GPIO_MUX_GPIO);        //配置IO口,P24给RS485
     GPIO_ENABLE_OUTPUT(P2TRIS,GPIO_PIN_4);            //推挽输出
    
     P24 = 0;    //拉低,关闭RS485发送

void UART0_IRQHandler(void)  interrupt UART0_VECTOR 
{
    if(UART_GetSendIntFlag(UART0))
    {
        UART_ClearSendIntFlag(UART0);    
    }
    
    if (UART_GetReceiveIntFlag(UART0)) 
    {
        
        Delayn10ms(100);  // 延时等待接收完成        
        P24 = 1;// 开启RS485发送
      
        UART_SendBuff(UART0, UART_GetBuff(UART0));// 发送接收到的数据
        Delayn10ms(100);  // 延时等待发送完成
        
        UART_ClearReceiveIntFlag(UART0);
        
        P24 = 0;// RS485转为接收
    }
    
    
}
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-16 13:38
    关注

    引自免费微信小程序:皆我百晓生

    您的问题涉及到UART转RS485的通信代码修改。从您提供的代码片段来看,已经对单片机CMS8S6990的串口通信例程进行了修改,添加了针对RS485方向控制的引脚操作,但在串口中断部分可能存在问题。以下是对您代码的修改建议:

    1. 在中断服务程序(ISR)中,首先检查接收中断标志,然后进行数据接收和处理。在处理完接收数据后,再切换RS485的方向为发送模式,发送数据后再切换回接收模式。这样可以确保在发送数据前接收中断已经完全处理完毕。
    2. 添加适当的延时以确保RS485通信的稳定性。但需要注意,延时的时间要适当,不能过长也不能过短。

    修改后的代码示例如下:

    void UART0_IRQHandler(void) interrupt UART0_VECTOR 
    {
        if (UART_GetReceiveIntFlag(UART0)) 
        {
            // 接收数据前的操作,如设置RS485为接收模式
            P24 = 0; // 关闭RS485发送
            Delayn10ms(100);  // 延时等待接收稳定
            
            // 接收数据
            UART_ReceiveData(UART0); // 这里应该是您用来读取接收数据的函数,根据实际的函数名进行修改
            Delayn10ms(100);  // 延时等待接收完成        
            
            // 设置RS485为发送模式,发送数据
            P24 = 1; // 开启RS485发送
            UART_SendBuff(UART0, UART_GetBuff(UART0)); // 发送数据
            Delayn10ms(100);  // 延时等待发送完成
            P24 = 0; // 发送完成后切换回接收模式
            
            // 清除接收中断标志
            UART_ClearReceiveIntFlag(UART0);
        }
        else if(UART_GetSendIntFlag(UART0)) // 检查发送中断标志位是否设置
        {
            // 处理发送相关的操作,如清除发送中断标志位等
            UART_ClearSendIntFlag(UART0);    
        }
    }
    

    请注意,以上代码仅为示例,具体的实现可能会因硬件和固件的不同而有所差异。此外,您还需要根据实际情况进行调试和测试以确保通信的稳定性和正确性。如果您使用的库函数或硬件接口有所不同,请根据实际情况进行相应的调整。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月16日

悬赏问题

  • ¥100 求懂行的大ge给小di解答下!
  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多
  • ¥15 设计一个温度闭环控制系统