首页 > 其他分享 >《串口篇》实现模拟串口通信(未验证)

《串口篇》实现模拟串口通信(未验证)

时间:2023-08-21 10:23:45浏览次数:39  
标签:验证 Text SerialPort 点击 pA 串口 data 模拟

实现串口通信

参考链接:https://www.jb51.net/article/279177.htm

新建项目

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

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

布局结果为
image

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

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

引入和虚拟串口

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

image

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

image

在添加串口对之后,在右侧最上方可以更改串口名字,例如改为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组串口用相同的方法实现后,就可以进行测试了,效果如下

image

标签:验证,Text,SerialPort,点击,pA,串口,data,模拟
From: https://www.cnblogs.com/fusio/p/17645280.html

相关文章

  • 《串口篇》实现串口通信
    实现串口通信参考链接:jb51.net/article/237854.htm本文实例为大家分享了C#实现串口通信的具体代码,供大家参考,具体内容如下基本概念前端效果使用winform代码实现如下点击查看代码namespaceSerialPortTest {   publicpartialclassForm1:Form   {......
  • CSP-J 模拟赛 C 题讲解
    前言鸣谢:感谢LHT大佬的推荐、GCK大佬的提醒以及LBJ大佬帮我接龙。原题链接随手给大家扔一份吧。题目大意给你一个\(1\)到\(n\)的数列,当\(a_i<a_{i-1}\)的时候(大于号和小于号其实不用管,因为最后所有方案都会遍历到,对答案没有影响)放置一个红色灯笼,否则放置一个绿......
  • 验证二叉搜索树
    98.验证二叉搜索树-力扣(LeetCode)二叉搜索树:根节点的左子树的所有元素的值都小于根节点,根节点右子树的所有元素都大于根节点的值。使用中序遍历的序列一定是一个递增的序列,因此一个二叉树如果中序遍历之后得到的是一个递增序列那么它一定是二叉搜索树。 ......
  • APB TIMER验证【一】
    APBTIMER功能介绍APBTIMER是一个32位的递减计数器,有以下特点:当计数器到达0时,可以产生一个中断请求信号TIMERINT。这个中断请求信号会一直保持直到它被清除(写入到INTCLEAR寄存器中)。可以使用外部输入信号EXTIN的0到1的变换,作为计数器的使能信号。如果APB计数器计数到达0,并......
  • java脚本模拟服务器内存溢出实战&服务器部署java项目
    一、背景:使用javaspringboot,实现linux服务器内存溢出情况。二、方案1、打包成war包,可以直接将war包部署在tomcat容器里2、springboot,打包成jar包。打的jar包,内置了tomcat,所以在服务器上,直接启jar包就行,没有必要放在tomcat容器里部署,在启动jar包时,可以配置线程池等。这......
  • 模拟实现简单的list
    这篇博客主要是关于使用模板实现list的模拟。什么是list:list是一种序列式容器,可以在常数时间内在任意位置进行插入和删除操作,并且支持前后双向迭代。list的底层是双向链表结构,每个元素存储在独立的节点中,节点通过指针指向前一个元素和后一个元素。list与forward_list非常相似,最主......
  • NOIP模拟2总结
    NOIP模拟2总结目录NOIP模拟2总结整体上:个体上第一题:zerosEGOI2021day1t1第二题:lunaEGOI2021day1t2第三题:cowsEGOI2021day2t3第四题:lanternsEGOI整体上:T1非常简单,但是在简单的T2耗费了大量的时间用于证明,导致简单的T3题都没看就跳过,T4暴力没得分个体上第一题:zero......
  • CSP模拟26
    可做场,拜谢fengwu老师。A.Reversi(AGC031B)题目链接一眼切了设$dp_i$表示考虑到第$i$个石头的总方案数。可由两种情况转移,不选择染色和选择染色,不染色直接由$dp_{i-1}$转移过来,染色由上一个和当前颜色相同的的石头转移过来,相当于把两个石子之间的染色。因为一......
  • CSP模拟赛题解
    目录CSP模拟16T1:糖果CSP模拟17T1:弹珠游戏T2:晚会CSP模拟18T1:TheThirdLetterT2:InaoftheMountainCSP模拟19T1:StrangeFunctionT2:DZYLovesModificationCSP模拟21T1:[CEOI2016]kangarooT2:[JOI2023Final]Advertisement2T3:YourCSP模拟22T1:TheChildandToyCSP模拟16T1:......
  • FEMU模拟器学习笔记
     QEMU参数解析  QEMU的main函数进来后,首先要进行参数解析。一个启动模拟器的命令行如下:x86_64-softmmu/qemu-system-x86_64-name"FEMU-ZNSSD-VM"-enable-kvm-cpuhost-smp2-m4G-devicevirtio-scsi-pci,id=scsi0-devicescsi-hd,drive=hd0-drivefile=/home......