SerialPort与三菱PLC通讯的问题(c# ) 本人正在用c#做一个与三菱PLC通讯的程序,用SerialPort类的DataReceived的事件接收的数据都分成几段。请问如何一次接收所有的数据。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 关注。楼主的通信是怎么写的啊?是用Modbus吗?学习。。 用用SerialPort类的DataReceived的事件,请看清楚。 这个与你设置的接收长度有关吧你可以判断一下子,如果收到了PLC的结束字符,你就处理一下,没有到就继续往里面加.我是先把PLC发送给上位机的东西保存到一个bit数组中,然后赋给stringbuilder http://blog.csdn.net/JustLovePro/archive/2008/12/15/3523348.aspx 我现在使用的是6楼withcsharp的方法,时间设定在0.15秒,但始终让人不放心。我用的是FX3U,接收的数据中,倒数第三位是03,最后两位是和校验代码。 代码大致如下,希望大家有更好的建议 private StringBuilder sb_Receive = new StringBuilder(); //定时发送数据 每1500ms发送一次。dsSendPool是dataset,储存发送数据。用LoadDefaut()从XML读取数据到DATASET private void timersend_Tick(object sender, EventArgs e) { dsSendPool.Tables[0].Clear(); //LoadDefaut()从XML读取数据到DATASET LoadDefaut(); int PoolRows; PoolRows = dsSendPool.Tables[0].Rows.Count; //SendData()为发送数据 SendData(dsSendPool.Tables[0].Rows[i_rows]["SendData"].ToString()); i_rows++; if (i_rows == PoolRows) { i_rows = 0; } //延迟150毫秒 timer_Receive.Interval = 150; timer_Receive.Enabled = true; } //发送后0.15秒接收 private void timer_Receive_Tick(object sender, EventArgs e) { //处理sb_Receive.ToString()数据 //清空sb_Receive timer_Receive.Enabled = false; int length = sb_Receive.Length; sb_Receive.Remove(0, length); } /// <summary> /// 发送数据到串口 /// </summary> private void SendData(string SendText) { if (ComPort.IsOpen) { try { // 转换用户十六进制数据到字节数组 byte[] data = HexStringToByteArray(SendText); // 发送数据到串口 ComPort.Write(data, 0, data.Length); } catch (FormatException) { //错误处理 } } } //接收数据 /// <summary> /// 接收数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { // 获取字节长度 int bytes = ComPort.BytesToRead; // 创建字节数组 byte[] buffer = new byte[bytes]; // 读取缓冲区的数据到数组 ComPort.Read(buffer, 0, bytes); //整理接收数据 sb_Receive.Append(ByteArrayToHexString(buffer)); } //十六进制转换字节数组 /// <summary> /// 十六进制转换字节数组 /// </summary> /// <param name="s"></param> /// <returns></returns> private byte[] HexStringToByteArray(string s) { s = s.Replace(" ", ""); byte[] buffer = new byte[s.Length / 2]; for (int i = 0; i < s.Length; i += 2) buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16); return buffer; } C# excel 编程 怎么获取 数据 筛选中过滤的值? 套用了母版页的内容页怎么在页面上找到它的onload 和 init事件 二个C#编程面试题,有兴趣的朋友过来做一下 这两个存储过程有什么区别啊? 请位C#高手写一个小程序 从公司拷个程序回来,在自己电脑上打不了,为什么是这样的? 如何实现流输出图片文件时,实现动态的GIF效果 各位大峡帮帮忙啊! 求教?怎样用C#编写复制,剪贴,粘贴菜单事件? 图片透明色! [DllImport("shell32.dll")] 是什么? 抽象类实现接口的意义是什么?
楼主的通信是怎么写的啊?是用Modbus吗?
学习。。
你可以判断一下子,如果收到了PLC的结束字符,你就处理一下,没有到就继续往里面加.
我是先把PLC发送给上位机的东西保存到一个bit数组中,然后赋给stringbuilder
我用的是FX3U,接收的数据中,倒数第三位是03,最后两位是和校验代码。
//定时发送数据 每1500ms发送一次。dsSendPool是dataset,储存发送数据。用LoadDefaut()从XML读取数据到DATASET
private void timersend_Tick(object sender, EventArgs e)
{
dsSendPool.Tables[0].Clear(); //LoadDefaut()从XML读取数据到DATASET
LoadDefaut(); int PoolRows;
PoolRows = dsSendPool.Tables[0].Rows.Count; //SendData()为发送数据
SendData(dsSendPool.Tables[0].Rows[i_rows]["SendData"].ToString());
i_rows++; if (i_rows == PoolRows)
{
i_rows = 0;
} //延迟150毫秒
timer_Receive.Interval = 150;
timer_Receive.Enabled = true;
}
//发送后0.15秒接收
private void timer_Receive_Tick(object sender, EventArgs e)
{
//处理sb_Receive.ToString()数据 //清空sb_Receive
timer_Receive.Enabled = false;
int length = sb_Receive.Length;
sb_Receive.Remove(0, length);
} /// <summary>
/// 发送数据到串口
/// </summary>
private void SendData(string SendText)
{
if (ComPort.IsOpen)
{
try
{
// 转换用户十六进制数据到字节数组
byte[] data = HexStringToByteArray(SendText); // 发送数据到串口
ComPort.Write(data, 0, data.Length);
}
catch (FormatException)
{
//错误处理
}
}
}
//接收数据
/// <summary>
/// 接收数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// 获取字节长度
int bytes = ComPort.BytesToRead; // 创建字节数组
byte[] buffer = new byte[bytes]; // 读取缓冲区的数据到数组
ComPort.Read(buffer, 0, bytes); //整理接收数据
sb_Receive.Append(ByteArrayToHexString(buffer)); } //十六进制转换字节数组
/// <summary>
/// 十六进制转换字节数组
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private byte[] HexStringToByteArray(string s)
{
s = s.Replace(" ", "");
byte[] buffer = new byte[s.Length / 2];
for (int i = 0; i < s.Length; i += 2)
buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
return buffer;
}