在仪表的Modbus通讯中,上位机可以是PLC、PC、PDA或智能手机。本人使用Windows Mobile 6操作系统下的多普达P660进行了上位机的编程。现在将调试程序说一下。
使用VS2005进行开发。
控件有3个button,两个TextBox,两个Label和一个SerialPort等。button1打开串口,button2将txtSend的字符发出,接收是自动的。接收txtReceive显示的是字符ASCII码的十进制数字,例如发送“12345”,txtReceive显示为“4950515253”。
txtReceive显示使用了在线程上异步执行指定委托。使用BeginInvoke和delegate完成。
接收使用事件private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)。
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;
namespace modbuscomm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private String strReceive ;
public delegate void InvokeDelegate();
public void Display()
{
txtReceive.Text = strReceive;
}
private void button1_Click(object sender, EventArgs e)
{
//更改参数
serialPort1.PortName = "COM6";
serialPort1.BaudRate = 9600;
// serialPort1.Parity = Parity.Odd; 默认是none
serialPort1.StopBits = StopBits.One;
//打开串口(打开串口后不能修改端口名,波特率等参数,修改参数要在串口关闭后修改)
serialPort1.Open();
}
private void button2_Click(object sender, EventArgs e)
{
//发送数据
//SendStringData(serialPort1);
//serialPort1.Write(txtSend.Text);
//也可用字节的形式发送数据
SendBytesData(serialPort1);
}
//发送字符串数据
private void SendStringData(SerialPort serialPort)
{
serialPort.Write(txtSend.Text);
}
//发送二进制数据
private void SendBytesData(SerialPort serialPort)
{
byte[] bytesSend="System".Text.Encoding.Default.GetBytes(txtSend.Text );
serialPort.Write(bytesSend, 0, bytesSend.Length);
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// 接收缓冲区中数据的字节数
int int_Len = serialPort1.BytesToRead;
// 接收数据
byte[] bytes = new byte[int_Len];
serialPort1.Read(bytes, 0, int_Len);
// 将数据存入字符串缓冲区中
for (int i = 0; i < bytes.Length; i++)
{
strReceive += bytes;
}
strReceive += "";
txtReceive.BeginInvoke(new InvokeDelegate(Display));
}
}
}
用户272664 2010-1-25 16:01
用户956949 2009-5-13 14:37