最近在做串口通信方面的程序,请问高手们怎样将从串口接收到的信息按二进制的形原样输出?
怎样将接收到的信息按照一定的规约解释出来?
怎样将接收到的信息按照一定的规约解释出来?
解决方案 »
- 刚看了一篇文章,请问这两种方法的调用有什么不同呢?
- WPF的入口函数在哪里?
- 在WEB项目中引用System.Windows.Forms,然后利用RtfToText控件把将数据库中存储的RTF代码转换成TEXT格式出错
- 求sql语句
- js 中使用 fileDialog报错的问题
- 请问如何取中间值
- 如何在用C#程序一键更换win 7的主题(themes)
- 哪有医学上免费的dicom类库
- 关于ashx文件中的Response.End()
- 现在的VS.NET正式版是英文版还是中文版?????D版出来没有啊!!!!
- 请各位大虾帮忙解决一个控件缩放问题
- ★★100分★★不用数据库,如何保存数据,并可增删改查操作,请详细回复!注意:需详细代码!
比如:this._serialPort.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
this._serialPort.ReceivedBytesThreshold = 1;
#region 接收串口数据
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
string strReceiveData = string.Empty;
byte[] buffer = Convert.FromBase64String(_serialPort.ReadLine());
strReceiveData = Encoding.Unicode.GetString(buffer);
//.......
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return;
}
}
#endregion
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using System.IO;
namespace SerialPorts
{
public partial class Form1 : Form
{
int year;//年
int month;//月
int day;//日
int hour;//小时
int minute;//分
int second;//秒
uint u_data;//用水量
int modify;//效验码
string message;
public Form1()
{
InitializeComponent();
}
private void btnSend_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
year =Convert.ToInt32(DateTime.Now.Year.ToString().Substring(2));
month = DateTime.Now.Month;
day = DateTime.Now.Day;
hour = DateTime.Now.Hour;
minute = DateTime.Now.Minute;
second = DateTime.Now.Second;
u_data = 1234;
modify = year + month + day + hour + minute + second + Convert.ToInt32(u_data.ToString().Substring(0, 2)) + Convert.ToInt32(u_data.ToString().Substring(2));
sendData();
btnSend.Enabled = false;
btnReceive.Enabled = true;
MessageBox.Show("开始发送数据!");
}
/// <summary>
/// 发送数据
/// <para>message --string 显示在界面的数据</para>
/// <para>data --byte[] 发送到缓存的数据</para>
/// </summary>
private void sendData()
{
message = "";
byte[] data = { 0xAA, 0xAA, 0xAA, byte.Parse(year.ToString()), byte.Parse(month.ToString()), byte.Parse(day.ToString()), byte.Parse(hour.ToString()), byte.Parse(minute.ToString()), byte.Parse(second.ToString()), byte.Parse(u_data.ToString().Substring(0, 2)), byte.Parse(u_data.ToString().Substring(2)), byte.Parse(modify.ToString()) };
foreach (byte s in data)
{
message += s.ToString() + ",";
}
_serialPort.Write(data, 0, 12);
lsbSendMessage.Items.Add(message.Substring(0, message.Length - 1));
}
private void btnReceive_Click(object sender, EventArgs e)
{
btnReceive.Enabled = false;
timer1.Enabled = false;
btnSend.Enabled = false;
chbCom1.Checked = false;
chbCom2.Checked = false;
MessageBox.Show(_serialPort.PortName + "口已断开!");
}
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Interval = 1000;
//btnSend_Click(sender, e);
sendData();
}
private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = false;
btnSend.Enabled = false;
btnReceive.Enabled = false;
}
private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] receive= new byte[1024];
_serialPort.Read(receive, 0, 3);
byte[] data ={ 0x55, 0x55, 0x55 };//硬件返回值
if (data[0] == receive[0])//应该比较3个,此处偷懒
{
timer1.Enabled = false;
btnSend.Enabled = false;
message=receive[0]+","+receive[1]+","+receive[2];
_serialPort.Close();
MessageBox.Show("数据已确认!");
}
}
/// <summary>
/// 打开串口
/// </summary>
/// <param name="com">串口名</param>
private void openCom(string com)
{
_serialPort.PortName = com;// SetPortName(_serialPort.PortName);
_serialPort.BaudRate = 9600;//SetPortBaudRate(_serialPort.BaudRate);
_serialPort.WriteBufferSize = 12;
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
_serialPort.Open();
//还可以增加很多设置选项
}
private void chbCom1_CheckedChanged(object sender, EventArgs e)
{
timer1.Enabled = false;
btnReceive.Enabled = false;
if (chbCom1.Checked)
{
if (chbCom2.Checked)
{
chbCom2.Checked = false;
_serialPort.Close();
}
btnSend.Enabled = true;
_serialPort.PortName = "com1";
openCom(_serialPort.PortName);
MessageBox.Show("com1口连接成功!");
}
else
{
btnSend.Enabled = false;
_serialPort.Close();
MessageBox.Show("com1口被断开!");
}
}
private void chbCom2_CheckedChanged(object sender, EventArgs e)
{
timer1.Enabled = false;
btnReceive.Enabled = false;
if (chbCom2.Checked)
{
if (chbCom1.Checked)
{
chbCom1.Checked = false;
_serialPort.Close();
}
btnSend.Enabled = true;
_serialPort.PortName = "com2";
openCom(_serialPort.PortName);
MessageBox.Show("com2口连接成功!");
}
else
{
btnSend.Enabled = false;
_serialPort.Close();
MessageBox.Show("com2口被断开!");
}
}
}
}