我的C#程序和下位机用 SerialPort里通信,波特率=115200。
下位机每过500毫秒给我传输数据包, (头)EE 数据 数据 数据 数据 (尾)DD.
一个文件包的形式。我在myDataReceived函数里解析这个包,但是最后发现下位机给我发的数据,我需要很长的时间才能接收到。我是调用m_sP.ReadByte(); 按Byte一位一位解析。比如下位机每过500MS给我一个文件包,但是我接受这个包的时间是2秒。目前感觉是C#里SerialPort不能进行高速率传输,但是感觉不可能啊.. 希望高手些给点建议,
要不只有找点其他串口通信模块了。非常感谢!!! C# SerialPort 传输速率
下位机每过500毫秒给我传输数据包, (头)EE 数据 数据 数据 数据 (尾)DD.
一个文件包的形式。我在myDataReceived函数里解析这个包,但是最后发现下位机给我发的数据,我需要很长的时间才能接收到。我是调用m_sP.ReadByte(); 按Byte一位一位解析。比如下位机每过500MS给我一个文件包,但是我接受这个包的时间是2秒。目前感觉是C#里SerialPort不能进行高速率传输,但是感觉不可能啊.. 希望高手些给点建议,
要不只有找点其他串口通信模块了。非常感谢!!! C# SerialPort 传输速率
{
try
{
int SDateTemp = m_sP.ReadByte(); // 0XEE. == 238
if (238 == SDateTemp)
{
bStartFileHead = true; // 有头时,就这样设置了.直接返回
return;
} // 0XDD == 221
// 处理数据并重新设置.
bool bCheck6 = false;
bool bCheck = false; // OXDD
if (221 == SDateTemp)
{
// 判断到是有OXDD.
// 判断中间的位数有没有6位,并且bStartFileHead是打开状态.
bCheck6 = CheckGetData(m_tempSendList);
if ((true == bCheck6) && (true == bStartFileHead))
{
bCheck = true; // reset.
bStartFileHead = false;
}
else
{
// 认为发过来的数据包有问题.把缓存数据清空,并重置.
m_tempSendList.Clear(); bStartFileHead = false; }
} // 判断如果开始头没打开,则不处理数据.
if (true == bStartFileHead)
{
m_tempSendList.Add(SDateTemp);
} // 判断是否是传回数据的值. 保存完16位再做处理.
// 用数据头0XEE开始 0XDD结尾
if (true == bCheck)
{
// 处理数据
}
} catch (Exception ex)
{
string strShow = ex.ToString();
throw ex;
}
}
这是为什么,是因为C/C++ 编写的原因么?希望高手们推荐个串口模块之类的C++的 感谢
异步读取时,当数据缓冲达到SerialPort.ReceivedBytesThreshold指定的数时后台线程触发一次DataReceived,然后你通过 Read从他的缓存里读出来。怎可以像你这样,异读进去了还用同步去读。同步是直接从端口一个一个读,直到读到你设定的超时值时他抛出一个异常,或直到你要求读的数量完成。
你这样试一下
在初始化时设好: m_sP.ReceivedBytesThreshold=6;
在private void myDataReceived里
byte[] buffer=new Byte[6];
m_sP.Read(buffer, 0, 6);
把try去掉别的对读有关的代码都去掉,因为上面两条就从你的缓存区里把你要的数据读到buffer里了
莫认串口类没有超时的
try
{
//阻塞到读取数据或超时
for (int i = 0; i <要读的数据的长度; i++)
{
buffer[i] = 串口.ReadByte();
}
}
catch (TimeoutException)
{
//超时处理}