SingleYork 发表于 2025-4-17 15:18:06

【15系列】SYK-0806-A2S1 工业自动化控制之【15-串口收发十六进制数】

大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“SYK-0806-A2S1 工业自动化控制之【14-串口收发字符串】”,

这一篇中,笔者继续给大家介绍“串口收发字十六进制数”。

有做工控项目的小伙伴们或许会发现,在很多应用场合,实际上都是用十六进制数来进行数据传递,包括MODBUS协议也是一些十六进制的数。

所以,笔者觉得有必要跟大家一起分享一下如何使用串口来收发十六进制数。

有了前面的基础,相信大家对串口收发数据并不陌生了,本例笔者以单个字节的十六进制数的收发为例,进行简单介绍。

例如,笔者现在要实现这么一个功能:

上位机发送0x00,控制板Y00输出ON ,并返回接收到的数据;
上位机发送0x10,控制板Y00输出OFF,并返回接收到的数据;

上位机发送0x01,控制板Y01输出ON ,并返回接收到的数据;
上位机发送0x11,控制板Y01输出OFF,并返回接收到的数据;

上位机发送0x02,控制板Y02输出ON ,并返回接收到的数据;
上位机发送0x12,控制板Y02输出OFF,并返回接收到的数据;

上位机发送0x03,控制板Y03输出ON ,并返回接收到的数据;
上位机发送0x13,控制板Y03输出OFF,并返回接收到的数据;

上位机发送0x04,控制板Y04输出ON ,并返回接收到的数据;
上位机发送0x14,控制板Y04输出OFF,并返回接收到的数据;

上位机发送0x05,控制板Y05输出ON ,并返回接收到的数据;
上位机发送0x15,控制板Y05输出OFF,并返回接收到的数据;

看上去似乎很简单,可是,对于新手来说也未必做得写的出来。那么笔者就简单介绍一下,想要实现上述功能,该怎么实现吧。

其实代码部分很简单,我们还是在之前的SYK-0806-A2S1 工业自动化控制之【13-串口收发单个字符】代码基础上做修改,

主要代码也还是在app.c文件中实现。

首先,还是一样需要对uart和gpio进行初始化:

void app_init(void)
{
      UART_config();               //UART初始化
    GPIO_Config();               //GPIO初始化
   
    EA = 1;                                       //开启总中断
}

接下来,由于逻辑也比较简单,所以笔者就偷懒直接将所有代码放到了uart1中断函数里面了:

/********************* UART1中断函数************************/
void UART1_int (void) interrupt UART1_VECTOR
{
      u8 RX_Data;
   
    if(RI)
      {
                RI = 0;
      RX_Data = SBUF;
      
      switch(RX_Data)
      {
            case 0x00:Y00 = OutputT_ON ;break;//接收到十六进制数0x00,Y00输出ON
            case 0x10:Y00 = OutputT_OFF;break;//接收到十六进制数0x10,Y00输出OFF
            
            case 0x01:Y01 = OutputT_ON ;break;//接收到十六进制数0x01,Y01输出ON
            case 0x11:Y01 = OutputT_OFF;break;//接收到十六进制数0x11,Y01输出OFF
            
            case 0x02:Y02 = OutputT_ON ;break;//接收到十六进制数0x02,Y02输出ON
            case 0x12:Y02 = OutputT_OFF;break;//接收到十六进制数0x12,Y02输出OFF
            
            case 0x03:Y03 = OutputT_ON ;break;//接收到十六进制数0x03,Y03输出ON
            case 0x13:Y03 = OutputT_OFF;break;//接收到十六进制数0x13,Y03输出OFF
            
            case 0x04:Y04 = OutputT_ON ;break;//接收到十六进制数0x04,Y04输出ON
            case 0x14:Y04 = OutputT_OFF;break;//接收到十六进制数0x14,Y04输出OFF
            
            case 0x05:Y05 = OutputT_ON ;break;//接收到十六进制数0x05,Y05输出ON
            case 0x15:Y05 = OutputT_OFF;break;//接收到十六进制数0x15,Y05输出OFF
            
            default:break;
      }
      
      SBUF = RX_Data;      //发送接收到的数据
      }

      if(TI)
      {
                TI = 0;
      }
}

由于是单个十六进制数的收发,因此也不需要担心收发忙的问题,关于动作的执行也很简单,笔者就用一个swtich()语句来实现了。

程序编译OK后,直接下载到板子上,通过串口助手一次发送对应的十六进制数,即可看到对应的输出ON或者OFF了。



好了,关于使用本节内容笔者就介绍到这里了,有疑问的小伙伴们可以给笔者留言或者直接参与评论,

下一节笔者将继续给大家介绍“串口的基本使用”,详见“SYK-0806-A2S1 工业自动化控制之【16-自定义协议通信】”,感谢大家的支持!

本章源代码:





国芯人工智能 发表于 2025-4-17 16:18:00

要实现上述功能,首先需要明确串口通信的基本原理以及如何通过串口收发十六进制数据。以下是一个详细的实现步骤,供大家参考。

1. 硬件连接与初始化
首先,确保控制板与上位机通过串口正确连接。通常,串口通信需要连接TX(发送)、RX(接收)和GND(地线)三根线。接下来,需要对串口进行初始化,设置波特率、数据位、停止位和校验位等参数。例如,常见的设置是波特率为9600,数据位为8,停止位为1,无校验位。

2. 串口接收数据
在控制板上,需要编写代码来接收上位机发送的十六进制数据。通常,串口接收数据是通过中断或轮询的方式实现的。以下是一个简单的伪代码示例:

c
void UARTReceiveHandler() {
    uint8t receiveddata = UARTRead(); // 从串口读取一个字节的数据
    processreceiveddata(receiveddata); // 处理接收到的数据
}

3. 数据处理与输出控制
接收到数据后,需要根据接收到的十六进制数来控制相应的输出端口。例如,接收到0x00时,控制Y00输出ON;接收到0x10时,控制Y00输出OFF。以下是一个简单的伪代码示例:

c
void processreceiveddata(uint8t data) {
    switch (data) {
      case 0x00:
            Y00 = ON;
            break;
      case 0x10:
            Y00 = OFF;
            break;
      case 0x01:
            Y01 = ON;
            break;
      case 0x11:
            Y01 = OFF;
            break;
      // 其他情况类似处理
      default:
            // 处理未知数据
            break;
    }
    UARTSend(data); // 返回接收到的数据
}

4. 串口发送数据
在控制板上,需要编写代码来将接收到的数据返回给上位机。以下是一个简单的伪代码示例:

c
void UARTSend(uint8t data) {
    UARTWrite(data); // 向串口写入一个字节的数据
}

5. 上位机程序
在上位机上,需要编写程序来发送十六进制数据并接收控制板返回的数据。以下是一个简单的伪代码示例:

python
import serial

ser = serial.Serial('COM1', 9600, timeout=1)# 打开串口

def senddata(data):
    ser.write(bytes())# 发送十六进制数据
    response = ser.read(1)# 读取返回的数据
    return response

示例:发送0x00并接收返回的数据
response = senddata(0x00)
print(f"Received: {response}")

6. 调试与测试
在实际应用中,可能会遇到各种问题,如数据丢失、通信错误等。因此,需要进行充分的调试与测试,确保通信的稳定性和可靠性。可以使用示波器、逻辑分析仪等工具来辅助调试。

7. 扩展与优化
在实际项目中,可能需要处理更复杂的数据格式和通信协议。例如,MODBUS协议通常包含多个字节的数据帧,需要进行帧头、帧尾、校验等处理。此外,还可以考虑使用DMA(直接内存访问)来提高串口通信的效率。

总结
通过以上步骤,可以实现基于串口的十六进制数据收发,并控制相应的输出端口。对于新手来说,理解串口通信的基本原理和掌握相关编程技巧是关键。希望本文能为大家在工业自动化控制项目中的串口通信应用提供一些帮助。

如果有任何问题或需要进一步的帮助,欢迎在评论区留言,笔者会尽力解答。感谢大家的阅读,祝大家在工控项目中取得圆满成功!

[本文内容由国芯人工智能辅助生成,仅供参考]

32位8051 发表于 2025-4-18 08:32:48

感谢楼主的分享,建议楼主发在同一个帖子里方便查阅哦

SingleYork 发表于 2025-4-18 09:23:36

32位8051 发表于 2025-4-18 08:32
感谢楼主的分享,建议楼主发在同一个帖子里方便查阅哦

已经全部收录到一个淘帖专栏了

jovewang 发表于 2025-4-18 18:44:06

原理图和PCB文件在哪里下载?
所有的源代码可以下载吗?

SingleYork 发表于 2025-4-19 10:35:35

jovewang 发表于 2025-4-18 18:44
原理图和PCB文件在哪里下载?
所有的源代码可以下载吗?

源代码见文末附件

jovewang 发表于 2025-4-19 14:43:47

SingleYork 发表于 2025-4-19 10:35
源代码见文末附件

谢谢! 刚刚没有看到。

SingleYork 发表于 2025-4-20 16:10:23

jovewang 发表于 2025-4-19 14:43
谢谢! 刚刚没有看到。

{:touxiao:}后面才上传的

jovewang 发表于 2025-4-20 16:53:37

SingleYork 发表于 2025-4-20 16:10
后面才上传的

能不能把原理图和PCB图也发出来。学习一下。

SingleYork 发表于 2025-4-21 13:00:02

jovewang 发表于 2025-4-20 16:53
能不能把原理图和PCB图也发出来。学习一下。

硬件部分前面都有介绍,无非就是多复制几遍了{:weixiao:}
页: [1]
查看完整版本: 【15系列】SYK-0806-A2S1 工业自动化控制之【15-串口收发十六进制数】