C#串口通信!

睡神在睡觉 2009-03-12 09:39:42
 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (serialPort1.BytesToRead == 8)
{
serialPort1.Read(BUFF_READ, 0, 8);
for (int i = 0; i < 2; i++)
{
textBox1.Text += BUFF_READ[i].ToString("X") + " ";
Array.Clear(BUFF_READ, 0, BUFF_READ.Length);
}
}
}


在监听串口的时候为什么在serialPort1_DataReceived事件里获得不到串口返回数据,用一个Timer来接收每个字节就可以接受到,但是过几秒就会把程序跑死,求解!谢谢
...全文
619 点赞 收藏 24
写回复
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzxap 2009-03-13
serialPort1.BytesToRead 转换为int型
回复
fsyfed 2009-03-13
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
serialPort1.Read(BUFF_READ, 0, 8);
for (int i = 0; i < 2; i++)
{
textBox1.Text += BUFF_READ[i].ToString("X") + " ";
Array.Clear(BUFF_READ, 0, BUFF_READ.Length);
}
}

试试~~~~
serialPort1.Read(BUFF_READ, 0, 8); 问题好像出现在这
回复
睡神在睡觉 2009-03-13
自己顶起来
回复
睡神在睡觉 2009-03-13
  private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
textBox1.Text += serialPort1.ReadByte().ToString("X") + " ";
Array.Clear(BUFF_READ, 0, BUFF_READ.Length);
}

把判断全都去掉,一样在textbox上显示不出数据啊
回复
fly_to_sky 2009-03-13
可以改变读取的方法,先将数据接收到,然后在验证数据的正确性!
回复
sxmonsy 2009-03-13
每次收八个太少,怎么一回不得收512个.
回复
浪子-无悔 2009-03-13
路过,顺便问个问题
可能用程序控制, 避免COM口被占用,假设被占用,程序也可以将其资源释放掉呢 ?
回复
018 2009-03-13
可以一次读一位,拼接到8位时再做处理,不然会丢数据。
回复
isinosun 2009-03-13
串口通讯不是很稳定,因此不要每次读8。
回复
018 2009-03-13
if (serialPort1.BytesToRead == 8)
{
serialPort1.Read(BUFF_READ, 0, 8);
for (int i = 0; i < 2; i++)
{
textBox1.Text += BUFF_READ[i].ToString("X") + " ";
Array.Clear(BUFF_READ, 0, BUFF_READ.Length);
}
}

看样子好像是每次都要接收8位,我觉得这样不太好。如果数据太拥挤,同时两个8位的数据,那读的时候就会丢数据。个人觉得应该8位8位的读,不够8位则等待下一次的接收拼在接收前面。

另外,
[Quote=引用 2 楼 sleep0110 的回复:]
没有触发,而且serialPort1.BytesToRead的值每次调试值都固定,要是1就一直到调试完都为1,要是2就 一直到调试完都为2,不大明白啊 。
[/Quote]

估计是不等于8时,如等于1,没有serialPort1.Read,你试试多一共else,然后把接收到的数据Read掉试试。

愚见!
回复
睡神在睡觉 2009-03-13
帮帮忙吧~
回复
通讯不是很明白,帮顶
回复
睡神在睡觉 2009-03-13
搞定了,串口丢弃字节问题,呵呵,很麻烦,看来串口通信没有说起来那么容易,
回复
hyd10000 2009-03-13
up
回复
饺子87 2009-03-13


int readwait=0;
while (bfsport.BytesToRead != 8)
{
readwait++;
if (readwait > 10000)
{
return false;
}
}

回复
led0led 2009-03-13
学习 up
回复
withcsharp 2009-03-13
还有 要 自己 拼包
回复
withcsharp 2009-03-13
serialPort1_DataReceived
里 不要 直接 调用 可视 控件

线称 同步的 问题
回复
CraxyMouse 2009-03-13
这个事件好像不太好用!
可以自己写你可以参考一下我写的这个!
/******************************************************************
* Copyright(c) : Tangxu
* Description :
* CreateDate : 2006-9-01 04:53:08
* Creater : Tang.xu
* LastChangeDate:
* LastChanger :
* Version Info : 1.0.0
* ******************************************************************/
using System;
using System.IO.Ports;
using System.Threading;
using System.Text;

namespace Tangxu.Common
{
public class ReadCom
{
public ReadCom()
{
_ReadConfig = new ReadConfigure(System.Environment.CurrentDirectory + "\\Com_Info.xml");
}

public ReadCom(string sCom,int nBaud):this()
{

}

private byte[] _ReadBuffer;
private SerialPort ss_port = new SerialPort();
private static int nReadCount = 0;
private ReadConfigure _ReadConfig;

#region Initialize com port

public bool InitCom()//初始化建串口类实例
{
// return true;
try
{
ss_port.PortName = _ReadConfig.GetNodeValue("PORT");// _sComPort;
ss_port.BaudRate = int.Parse(_ReadConfig.GetNodeValue("BAUD"));//_nBaud;
ss_port.ReadBufferSize = 10240;
ss_port.DataBits = int.Parse(_ReadConfig.GetNodeValue("DATA"));//8;
switch (_ReadConfig.GetNodeValue("PARITY"))
{
case "None":
ss_port.Parity = Parity.None;
break;
case "Even":
ss_port.Parity = Parity.Even;
break;
case "Mark":
ss_port.Parity = Parity.Mark;
break;
case "Odd":
ss_port.Parity = Parity.Odd;
break;
case "Space":
ss_port.Parity = Parity.Mark;
break;
}
switch (_ReadConfig.GetNodeValue("STOP"))
{
case "1":
ss_port.StopBits = StopBits.One;
break;
case "1.5":
ss_port.StopBits = StopBits.OnePointFive;
break;
case "2":
ss_port.StopBits = StopBits.Two;
break;
}
ss_port.ReadTimeout = 600;
ss_port.WriteTimeout = 700;

ss_port.Open();//打开串口
return true;
}
catch (Exception ex)
{
throw new Exception("打开串口失败!\r\n错误信息:" + ex.Message);
}
}
#endregion

#region FreeDrv
/// <summary>
/// free opw
/// </summary>
public void FreeDrv()
{
try
{
if (ss_port != null)
{
ss_port.Close();
}
}
catch
{ }
}
#endregion

#region Write command to OPW
/// <summary>
/// 发操作命令给OPW设备
/// 并返回状态
/// </summary>
/// <param name="sCommand"> </param>
/// <returns> </returns>
public string WriteCommand(string sCommand)
{
StringBuilder sb = new StringBuilder();
bool bRead = true;
try
{
ss_port.DiscardInBuffer();
ss_port.Write(sCommand);
Thread.Sleep(1500);
while (bRead)
{
_ReadBuffer = new byte[ss_port.BytesToRead];
ss_port.Read(_ReadBuffer, 0, _ReadBuffer.Length);
sb.Append(Encoding.ASCII.GetString(_ReadBuffer));
Thread.Sleep(500);
if (ss_port.BytesToRead <= 0)
{
bRead= false;
}
}
if (sb.ToString().Length== 0)
{
nReadCount++;
}

if (nReadCount == 3)
{
nReadCount = 0;
throw new Exception("设置不正确或没有联接设备!");
}
}
catch (Exception ex)
{
throw new Exception("从设备获取数据失败!\r\n错误信息:" + ex.Message);
}
return sb.ToString(); ;
}

public string WriteCommand(byte[] bCommand)
{
StringBuilder sb = new StringBuilder();
bool bRead = true;
try
{
ss_port.DiscardInBuffer();
ss_port.Write(bCommand,0,bCommand.Length);
Thread.Sleep(1500);
while (bRead)
{
_ReadBuffer = new byte[ss_port.BytesToRead];
ss_port.Read(_ReadBuffer, 0, _ReadBuffer.Length);
sb.Append(Encoding.ASCII.GetString(_ReadBuffer));
Thread.Sleep(500);
if (ss_port.BytesToRead <= 0)
{
bRead = false;
}
}
if (sb.ToString().Length == 0)
{
nReadCount++;
}

if (nReadCount == 3)
{
nReadCount = 0;
throw new Exception("设置不正确或没有联接设备!");
}
}
catch (Exception ex)
{
throw new Exception("从设备获取数据失败!\r\n错误信息:" + ex.Message);
}
return sb.ToString();
}
#endregion

#region Get All COM Port
public string[] GetAllComPort()
{
string[] sAllPort = null;
try
{
sAllPort = SerialPort.GetPortNames();
}
catch (Exception ex)
{
throw new Exception("获取计算机COM口列表失败!\r\n错误信息:" + ex.Message);
}
return sAllPort;
}
#endregion
}

}
回复
睡神在睡觉 2009-03-12
自己顶个
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.