出于简单考虑,首先创建一个 Winform 项目,本文项目名称为 portTest

串口通信,至少有两个串口才能通信,所以拖动两个 GroupBox ,一左一右,里面分别放置一个 Combobox 、一个按钮,以及两个 TextBox 用于发送和接收内容,第二个 TextBox 要点击右上角的三角选择 多行

布局结果为

其中,串口A和串口B中各控件的名称为

串口A 串口B
combobox cbA cbB
按钮 btnA BtnB
发送文本框 tbSendA tbSendB
接收文本框 tbRecvA tbRecvB

由于.Net6.0并不内置串口通信模块,所以需要额外下载,点击菜单栏 工具 -> NuGet包管理器 -> 管理解决方案的NuGet包 ,点击 浏览 选项卡,搜索 Ports ,选择 System.IO.Ports ,在右侧出现的详细信息中,选中 portTest 项目,点击 安装 按钮。

此外,如果没有合适的用于串口测试的硬件设备,可以下载一个虚拟串口,这里推荐开源的 com0com ,下载之后根据自己电脑位数选择一个进行安装,记住安装路径,安装结束后,打开相应路径中的setupg.exe,如下图所示,通过 Add Pair 可以添加串口对

在添加串口对之后,在右侧最上方可以更改串口名字,例如改为COM4和COM5,然后点击apply,串口名字就会在左侧发生更改。根据右侧线路图可知,发给COM4的信息,会被转发给COM5;发给COM5的信息则会转发给COM4。

接、化、发

点击 F7 进入代码页面,开始串口开发,主要分为一下流程。

本文基于.Net6.0在顶级语句中开发,所以不需要额外 using ;否则的话需要添加 using System.IO.Ports; ,以确保串口可以调用。并声明两个全局变量,用于后续的串口通信。

  SerialPort pA;
  SerialPort pB;

然后,确保combobox可以正确识别串口名称,故而在 InitializeComponent();下方,添加如下循环

foreach (var item in SerialPort.GetPortNames())
    cbA.Items.Add(item);
    cbB.Items.Add(item);

其中,GetPortNames函数可以获取所有可用的串口名称。

接下来,双击连接按钮,创建点击命令,下面以按钮A进行示例,对按钮B只需将所有的A换成B即可。

private void btnA_Click(object sender, EventArgs e)
    if (btnA.Text=="连接"){
        pA = new SerialPort(cbA.SelectedItem.ToString(), 
            115200, Parity.Odd, 7, StopBits.One);
        pA.Open();
        pA.DataReceived += PA_DataReceived;
        btnA.Text = "断开";
    else{
        pA.Close();
        btnA.Text = "连接";

SerialPort的构造函数中,输入参数分别是串口名称、波特率、校验位、长度、截止位。

PA_DataReceived是一个委托,为串口接收到数据时执行的操作,一般写完+=之后,点击回车VS会自动创建,其内容为

private void PA_DataReceived(object sender, SerialDataReceivedEventArgs e)
    byte[] data = new byte[pA.BytesToRead];
    pA.Read(data, 0, data.Length);//从串口读取数据
    string info = Encoding.UTF8.GetString(data);
    tbRecvA.BeginInvoke(new Action(() => { tbRecvA.Text += $"接收:{info}"; }));

由于串口的接收函数是异步执行的,并不属于窗口主线程,所以当串口接收到数据后,如果想在窗口中显示,就必须用BeginInvoke来另开一个线程。

最后,编写串口的发送程序,当tbSend检测到回车键时,则发送文本框中的内容。

private void tbSendA_KeyDown(object sender, KeyEventArgs e)
    if (e.KeyCode != Keys.Enter)
        return;
    var data = Encoding.UTF8.GetBytes(tbSendA.Text);
    tbRecvA.Text += $"发送:{tbSendA.Text}\n";
    pA.Write(data, 0, data.Length);

上面只实现了A组串口,将B组串口用相同的方法实现后,就可以进行测试了,效果如下

资源名:c#与485MODBUS接口的PLC进行串口通信程序源码 资源类型:程序源代码 源码说明: c#与485MODBUS串口通信源代码,通过串口读取设备数据c#的源代码,比如读取PLC数据(AD采集的或设置的),可以控制PLC(支持MODBUS)动作,485通信可以达到500M(稳定通信),也可和单片机通信,我资源里有关于8051MODBUS程序。 适合人群:新手及有一定经验的开发人员
在串口接收很多数据且速度很快时,用Invoke后,关闭串口会导致界面卡死,如果改用BeginInvoke则关闭串口时,可以关闭串口且界面不会卡死。 this.Invoke((EventHandler)(delegate this.BeginInvoke((EventHandler)(delegate
要使用C#连接PLC S7-200串口通信PPI协议,需要使用一个称为S7.Net的库。以下是基本步骤: 1. 安装S7.Net库:在Visual Studio中,通过NuGet包管理器搜索和安装S7.Net库。 2. 配置串口:使用System.IO.Ports命名空间中的SerialPort类来配置串口。设置波特率、数据位、奇偶校验和停止位等参数。 3. 连接PLC:使用S7.Net库中的Plc类来连接PLC。指定PLC的IP地址和Rack/Slot号码。 4. 读取数据:使用Plc类中的ReadBytes方法来读取PLC中的数据。指定数据块地址和字节长度。 5. 写入数据:使用Plc类中的WriteBytes方法来向PLC中写入数据。指定数据块地址和数据。 下面是一个简单的示例代码: using System; using System.IO.Ports; using S7.Net; namespace PLCSerialCommunication class Program static void Main(string[] args) // Configure serial port SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); serialPort.Open(); // Connect to PLC Plc plc = new Plc(CpuType.S7200, "10.0.0.1", 0, 1); plc.Open(); // Read data from PLC byte[] data = plc.ReadBytes(DataType.DataBlock, 1, 0, 10); // Write data to PLC byte[] newData = new byte[] { 0x01, 0x02, 0x03 }; plc.WriteBytes(DataType.DataBlock, 1, 0, newData); // Close connection to PLC and serial port plc.Close(); serialPort.Close(); 请注意,此示例代码仅用于演示目的,实际使用时可能需要进行更多的错误处理和异常处理。
我是大暖男: 引用「if __init__=="__main__": testFres()」 应该把 if __init__=="__main__": testFres()改成if __name__ == "__main__": test_Fres() 还有那个光波振幅截面图代码应该是有问题的照着复制一遍也无法输出图形。 cartopy在地图中添加经纬线 cuiweijia111: 博主你好,请问怎么画出来向外凸起的坐标轴刻度线呢 通过Python绘制九种二次曲面 何觊文考研英语: ax.gca(projection='3d')如果使用不了,添加图例 fig = plt.figure() ax = fig.add_subplot(projection='3d') 通过pyproj进行WGS84到UTM坐标的转换 small_nini: 您好,请问有EPSG:32653这个坐标系嘛?