C#学习--项目实战之串口通信工具三

写在前面

不学不知道,一学吓一跳,一个礼拜之前做完了这个串口通信工具,感觉自己牛的不行,因为工作原因,一直没做实况测试,所以一直沉浸在我是高手的感觉中。。。这两天做了一些实况测试,我的妈,问题一大堆。。。

缓冲区问题

因为测试的失败,我又花了一个小时,找到SerialPort的官方文档并仔细的阅读了一边,其实大多数方法和属性的概念还是很好理解的,唯独关于缓冲区的知识点我是一个都没看懂,什么接收缓冲区,输入缓冲区,SerialPort缓冲区,总之就是各种各样的缓冲区,然后根据串口通信原理,我以为这些缓冲区都是有联系的,但是经过我的多方考证,上位机是访问不到设备的缓存区的,最远也只能访问到PC串口驱动上的缓存区,所以SerialPort类上的任何关于缓冲区的属性和方法操作的都是上位机的缓冲区与下位无关。

多个线程同时操作一个队列问题

我的上位机是接受下位机传感器的数据,然后制图。但是在制图后,观察图表会发现,图标经常会出现缺失数据块的现象,我首先想到的就是串口通信的常见问题,丢包了呗。但是在用过很多专业的工具测试后发现,只有我的程序有这种现象。我表示不服,凭啥我写的程序就不好使呢。因为是多线程处理的程序,所以数据存储这一块用的是队列,因为队列的存取分别是对这个队列的头尾进行的,所以可以在一定程度上解决多线程对一个对象同时操作而产生的死锁问题。但是实时上传数据的工具,上传数据量很大,所以我就想是不是大量数据的流动导致了队列的数据丢失。但是这个问题不容易检测,我又不能对每进队列的数据都做记录吧,那我只能做对比测试,选择一个比队列更好的集合来解决这个问题,这就是 ConCurrentQueue 高效的线程安全队列。

using System.Collections.Concurrent;

private ConcurrentQueue<byte[]> dataQueue = new ConcurrentQueue<byte[]>();

果然,不出我所料,就是因为队列不安全的原因。当然我只是挑选了比较重要的问题来说,其实在实测的时候还遇到了很多问题。。。

写在结尾

真实要不断的学习不断的进步啊,一个月以前,我对串口通信的了解最多也就是,书里面的一个专业名词,但是一个月的项目经验,真的帮助了我很多,所以这里告诉大家一个真理,学一样东西,最好的方法就是不断的使用和完善它。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用C#连接PLC S7-200并使用PPI协议进行串口通信,您需要遵循以下步骤: 1. 确保您具有连接PLC的PPI串口电缆和PLC的PPI串口模块。 2. 在您的计算机上安装Siemens Step 7或其他PLC编程软件,以便您可以设置PLC的通信参数(如波特率和数据位)。 3. 在Visual Studio中创建一个新的C#控制台应用程序。 4. 添加一个SerialPort组件以便您可以从计算机的串行端口与PLC通信。 5. 设置SerialPort组件的属性,例如端口号,波特率,数据位等。 6. 使用SerialPort组件的Open方法打开串口连接。 7. 使用PPI协议编写C#代码以便您可以与PLC通信,例如读取和写入数据。 以下是一个简单的示例代码,演示如何使用C#连接PLC S7-200并使用PPI协议进行串口通信: ``` using System; using System.IO.Ports; namespace PLCCommunication { class Program { static void Main(string[] args) { // 设置串口参数 SerialPort serialPort = new SerialPort(); serialPort.PortName = "COM1"; serialPort.BaudRate = 9600; serialPort.DataBits = 8; serialPort.StopBits = StopBits.One; serialPort.Parity = Parity.None; // 打开串口连接 serialPort.Open(); // 发送读取数据的PPI协议命令 byte[] command = new byte[] { 0x68, 0x0A, 0x0A, 0x68, 0x02, 0xF0, 0x80, 0x32, 0x01, 0x01, 0x16 }; serialPort.Write(command, 0, command.Length); // 从串口读取PLC响应 byte[] response = new byte[1024]; int bytesRead = serialPort.Read(response, 0, response.Length); // 关闭串口连接 serialPort.Close(); // 处理响应数据 for (int i = 0; i < bytesRead; i++) { Console.Write(response[i].ToString("X2") + " "); } } } } ``` 请注意,上面的代码仅提供了一个基本示例,您需要根据您的实际需要进行更改和调整。另外,由于PPI协议是Siemens专有的协议,因此您需要查阅相关文档以便了解如何正确编写PPI协议命令以与PLC通信

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值