本文实例讲述了C#串口通信实现方法。分享给大家供大家参考。具体方法如下:
通过COM1发送数据,COM2接收数据。当COM2接收完本次发送的数据后,向COM1发送信息通知COM1本次数据已发完,COM1接到通知后,再发下一段数据。这样可以确保每次发送的数据都可以被正确接收。
代码如下:
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 串口通信
{
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 Form1
public Form1()
{
InitializeComponent();
}
#endregion
#region Form1_Load
private 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_FormClosed
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
serialPort1.Close();
serialPort1.Dispose();
serialPort2.Close();
serialPort2.Dispose();
}
#endregion
#region btnStart_Click
private 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";
};
&