比如:通过COM1发送数据,COM2接收数据。当COM2接收完本次发送的数据后,向COM1发送信息通知COM1本次数据已发完,COM1接到通知后,再发下一段数据。这样可以确保每次发送的数据都可以被正确接收。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using Utils;namespace com1_com2
{public partial class Form1 : Form{#region 变量/// <summary>/// 启动还是停止,true起动,false停止/// </summary>public static bool start = true;/// <summary>/// 串口资源/// </summary>private static SerialPort serialPort1 = null;/// <summary>/// 串口资源/// </summary>private static SerialPort serialPort2 = null;/// <summary>/// 成功次数/// </summary>private static int successCount = 0;/// <summary>/// 失败次数/// </summary>private static int errorCount = 0;/// <summary>/// 上次计算的总次数/// </summary>private static int lastCount = 0;/// <summary>/// 定时器/// </summary>private System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();#endregion#region Form1public Form1(){InitializeComponent();}#endregion#region Form1_Loadprivate void Form1_Load(object sender, EventArgs e){serialPort1 = new SerialPort("COM1");serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived1);serialPort1.Open();serialPort2 = new SerialPort("COM2");serialPort2.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived2);serialPort2.Open();}#endregion#region Form1_FormClosedprivate void Form1_FormClosed(object sender, FormClosedEventArgs e){serialPort1.Close();serialPort1.Dispose();serialPort2.Close();serialPort2.Dispose();}#endregion#region btnStart_Clickprivate void btnStart_Click(object sender, EventArgs e){start = true;SendData();timer.Interval = 500;timer.Tick += new EventHandler(delegate(object obj, EventArgs eventArgs){if (lastCount == 0){lastCount = successCount + errorCount;}else{int cnt = successCount + errorCount - lastCount;cnt = Data.Length * cnt / 1024 * (1000 / timer.Interval);double total = (successCount + errorCount) * Data.Length / 1024.0;InvokeDelegate invokeDelegate = delegate(){label3.Text = cnt.ToString() + "KB/S " + total.ToString("#.0") + "KB";};InvokeUtil.Invoke(this, invokeDelegate);lastCount = successCount + errorCount;}});timer.Start();}#endregion#region btnStop_Clickprivate void btnStop_Click(object sender, EventArgs e){start = false;timer.Stop();timer.Dispose();timer = new System.Windows.Forms.Timer();}#endregion#region 接收串口数据事件/// <summary>/// 接收串口数据事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>public void serialPort_DataReceived1(object sender, SerialDataReceivedEventArgs e){if (serialPort1.ReadLine() != null){successCount++;SendData();}}/// <summary>/// 接收串口数据事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>public void serialPort_DataReceived2(object sender, SerialDataReceivedEventArgs e){List<byte> bList = new List<byte>();int i = 0;while (serialPort2.BytesToRead > 0){byte[] bArr = new byte[serialPort2.BytesToRead];i += serialPort2.Read(bArr, 0, bArr.Length);bList.AddRange(bArr);}serialPort2.WriteLine("success");string s = ASCIIEncoding.UTF8.GetString(bList.ToArray());InvokeDelegate invokeDelegate = delegate(){textBox2.Text = s;};InvokeUtil.Invoke(this, invokeDelegate);if (s != Str){errorCount++;invokeDelegate = delegate(){label2.Text = errorCount + "次不相等(失败)";};InvokeUtil.Invoke(this, invokeDelegate);}else{invokeDelegate = delegate(){label1.Text = successCount + "次相等(成功)";};InvokeUtil.Invoke(this, invokeDelegate);}}#endregion#region 发送数据private void SendData(){if (start){Thread thread = new Thread(new ParameterizedThreadStart(delegate(object obj){InvokeDelegate invokeDelegate = delegate(){textBox1.Text = Str;};InvokeUtil.Invoke(this, invokeDelegate);serialPort1.Write(Data, 0, Data.Length);}));thread.Start();}}#endregion#region 数据private static byte[] data = null;/// <summary>/// 数据/// </summary>private static byte[] Data{get{if (data == null){data = ASCIIEncoding.UTF8.GetBytes(Str);}return data;}}#endregion#region 获取字符串private static string str = null;/// <summary>/// 字符串/// </summary>private static string Str{get{if (str == null){StringBuilder sb = new StringBuilder();for (int i = 0; i < 270; i++){sb.Append("计算机程序");}str = sb.ToString();}return str;}}#endregion}
}

关于跨线程委托的问题

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;namespace Utils
{/// <summary>/// 跨线程访问控件的委托/// </summary>public delegate void InvokeDelegate();/// <summary>/// 跨线程访问控件类/// </summary>public class InvokeUtil{/// <summary>/// 跨线程访问控件/// </summary>/// <param name="ctrl">Form对象</param>/// <param name="de">委托</param>public static void Invoke(Control ctrl, Delegate de){if (ctrl.IsHandleCreated){ctrl.BeginInvoke(de);}}}
}

相关类Uitls.Ports:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using System.Security.Permissions;
using System.IO.Ports;
using System.Security;namespace Utils
{/// <summary>/// 串口资源工具类/// </summary>public class SerialPortUtil{#region 获取本机串口列表,包括虚拟串口/// <summary>/// 获取本机串口列表,包括虚拟串口/// </summary>public static string[] GetCOMList(){List<string> list = new List<string>();foreach (string portName in SerialPort.GetPortNames()){list.Add(portName);}return list.ToArray();}#endregion#region 从注册表获取本机串口列表/// <summary>/// 从注册表获取本机串口列表/// </summary>public static string[] GetPortNames(){RegistryKey localMachine = null;RegistryKey key2 = null;string[] textArray = null;//这里有个断言,判断该注册表项是否存在new RegistryPermission(RegistryPermissionAccess.Read, @"HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM").Assert();try{localMachine = Registry.LocalMachine;key2 = localMachine.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM", false);if (key2 != null){string[] valueNames = key2.GetValueNames();textArray = new string[valueNames.Length];for (int i = 0; i < valueNames.Length; i++){textArray[i] = (string)key2.GetValue(valueNames[i]);}}}finally{if (localMachine != null){localMachine.Close();}if (key2 != null){key2.Close();}CodeAccessPermission.RevertAssert();}if (textArray == null){textArray = new string[0];}return textArray;}#endregion}
}

c#串口模拟互发数据(COM1-COM2)相关推荐

  1. 51单片机串口的应用(单片机和电脑互发数据)

    现在来详细看一下寄存器,我们直接查看单片机手册. SCON寄存器 先来说说SCON寄存器. 前一节我们提过,我们一般使用串口用的是模式1,即8位UART,这样我们就用不到校验位.从手册中可以看到,寄存 ...

  2. 【RoboMaster】A板串口DMA接发数据及模块数据解析(GY33颜色传感器)

    文章目录 1.串口初始化配置 1.1CubeMX配置 1.1.1 项目总体配置 1.1.2串口参数配置 开启串口 DMA&NVIC 1.2 代码 1.2.1 串口初始化 1.2.2 串口中断数 ...

  3. 揭秘计算机之间互发数据的关键原理!

    作者 | 帅地 责编 | 胡巍巍 前言 天各一方的两台计算机是如何通信的呢?在成千上万的计算机中,为什么一台计算机能够准确着寻找到另外一台计算机,并且把数据发送给它呢? 可能很多人都听说过网络通信的 ...

  4. ModbusPoll和ModbusSlave使用(搭配VSPD,串口接收发数据)

    modbuspoll和modbusSlave在通讯上有五种方式,本篇介绍的是其中关于Serial Port串口的通讯 使用VSPD虚拟串口,创建虚拟端口COM1和COM2 Modbus Poll和Mo ...

  5. linux下发送hex数据的串口调试软件,linux下模拟串口向计算机发送数据

    本人新手   从网上找了个串口通信程序改了改  本来是用单片机向串口发数据测试   但现在手头没有   请问有没有什么别的方法可以用? 非常感谢 | 一.使用工具 Windows XP 串口调试器 C ...

  6. 求助帖;RxtxFAX怎样通过调用传真服务器的串口COM1,COM2,通过电话线座机号发送传真?

    求助帖;RxtxFAX怎样通过调用传真服务器的串口COM1,COM2,通过电话线座机号发送传真? 目前我通过引用fax4j的jar包,然后在服务器配置rxtx-2.2pre2的RXTXcomm.jar ...

  7. 51单片机stc15w204s串口通信发数据接收数据串口中断发中文字符串完美运行软件延时发送一字节函数全注释

    这里写自定义目录标题 KEIL自己先调试通了然后再说下面的事 51单片机stc15w204s串口通信直接上文件 KEIL自己先调试通了然后再说下面的自己看看就可 KEIL自己先调试通了然后再说下面的事 ...

  8. NBIOT专栏之BC28串口连接阿里云物联网平台接发数据

    NBIOT专栏系列目录 创思通信BC28核心板+STM32F系列单片机开发记录博客 BC28核心板资料包下载: https://pan.baidu.com/s/1Du7EXgMRAmbFupT_VUY ...

  9. stm32 串口发数据 0x00 变 0x80

    stm32 串口发数据 0x00 变 0x80 一般配置奇校验odd和偶校验even的时候,会出现这个问题,根本原因是stm32在计算长度的时候,会把校验位也计算进去,所以你之前设置的数据位8要改成数 ...

最新文章

  1. Still unable to dial persistent://blog.csdn.net:80 after 3 attempts
  2. 共空间模式 Common Spatial Pattern(CSP)原理和实战
  3. win主机ping不通linux的IP
  4. 小学五年级年级计算机教学计划,小学五年级信息技术教学计划范文
  5. Redis如何高效可靠地实现主从复制?终于有人讲明白了
  6. 《课程的反思与重建--我们需要什么样的课程观》之学习体会
  7. 【kafka】kafka 启动 KafkaController 相关源码分析
  8. Linux学习笔记---使用tftp命令下载文件
  9. [论文评析]人体脉搏波速与血压之间关系探索新突破
  10. 疯狂java讲义第八章课后习题答案
  11. C++ 语言学习入门--类
  12. (BFM2009只是公开了数据模型,与99年开山基本一样)BM2009文献翻译
  13. 用php做一个相册的程序,搭建自己的相册 50个免费的相册程序(上)
  14. 菜农谋略:搞定牛人宋俊德,对女牛人孙昌旭说:“记住,俺是雁塔菜农~~~ ”
  15. 2018年12月最新win101809教育版激永久激活密钥和方法
  16. twitter账户受限_如何为您的企业设置Twitter帐户
  17. Could not find apk!终于解决了! 坐在我旁边的领导帮我弄的~~ 大家谢谢他吧~~
  18. 【如何在寒武纪MLU上进行算法移植】-概述
  19. 实时操作系统UCOS学习笔记1----UCOSII简介
  20. 02Linux常用的基本命令

热门文章

  1. Oracle转PostgreSQL之start with / connect by
  2. 汉字区位码、机内码学习笔记
  3. 微软Skype开始采用全新图标 淘汰云朵图案
  4. 【云原生工具集】洋气·给程序自定义启动图案
  5. socket通信技术
  6. HTML5+Downloader文件下载
  7. 利用Python爬虫网站数据直接导入mysql数据库中
  8. gta5因为计算机丢失,GTA5丢失MSVCR100.dll怎么办 修复方法介绍
  9. 中国石油大学(北京)-《 油田化学》第二阶段在线作业
  10. 【漏洞发现-1】操作系统之漏洞探针类型及利用