SerialPort接收数据不完整?

njciapple 2009-03-19 10:37:03
我用SerialPort的DataReceived事件接收数据,每次只能接收6个字符,不知道是不是和serialport的WriteTimeout和ReadBufferSize有关,这些我都设置了

WriteTimeout = 1000
ReadTimeout = 1000
WriteBufferSize = 40960
ReadBufferSize = 40960
Handshake = Handshake.None
DtrEnable = true
RtsEnable = true

我在DataReceived事件中试过如下三种都不行:
第一种

int DataLength = s_port.BytesToRead;
int n = 0;
StringBuilder sb = new StringBuilder();
while (n < DataLength)
{
byte[] ds = new byte[1024];
int len = s_port.Read(ds, 0, 1024);
sb.Append(Encoding.ASCII.GetString(ds, 0, len));
n += len;
}
string response = string.Empty;
response = sb.ToString();


第二种

string response = string.Empty;
response = s_port.ReadExisting();
System.Threading.Thread.Sleep(200);


第三种

string response = string.Empty;
int bytesCanRead = s_port.BytesToRead;
if (bytesCanRead > 0)
{
byte[] bzData = new byte[bytesCanRead];
s_port.Read(bzData, 0, bytesCanRead);
response = ByteArrayToHexString(bzData).Trim();
response = response.Replace(" ", "");
}

然后将response解码后存入数据库中,但是每次只能接收到六个字符,我确定解码没有问题!
请指教一下,还有,我的短信猫和程序需要长时间运行,有可能程序发短信时,短信猫要接收短信,
就是说,我在发短信时,可能别人发短信过来,我需要接收,担心这样会有阻塞问题,
大家有没有好的建议,听别人说可以做两个线程,一个队列,(一个线程不断接收,接收后放入队列中,一个线程发送),感觉这个想法不错,
但是不会写,请大家帮帮忙!
...全文
1054 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
njciapple 2009-03-21
  • 打赏
  • 举报
回复
谢谢几位!结贴去!
CraxyMouse 2009-03-19
  • 打赏
  • 举报
回复
这个事件好像不太好用!
可以自己写你可以参考一下我写的这个!
/******************************************************************
* 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
}

}
zcandyly20211 2009-03-19
  • 打赏
  • 举报
回复
友情up!
EveryCase 2009-03-19
  • 打赏
  • 举报
回复
顶~~~~~~~~~~~~~

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧