协议简单说明
1.协议三条数据分别是, 190个字符!200字符,。。2.字头ABCD,先拿第一条数据来说 190字符,只能拿这两个数据来判断一条命令了,总之这个协议定不不好
3.ABCD后面的字符,3131=控制返回命令, 3232=读电流, 3333= 读电表, 比如ABCD3232.....(共190字符长度),而且我的协议只能靠固定的位来判断每个字节是做什么用的(中间没有,或者分隔符,只能截取)程序写法
我的字符从串口是一个字符一个字符来的,比如先来A,在来B.......
请问我的程序 OnRxChar(ref byte c)函数里或者其他里,应该怎么写才能提高效率,并且保证数据不丢失.希望大家指教.
protected override void OnRxChar(ref byte c)
{
s += new string((char)c,1);//转换string
if(s.StartsWith("ABCD") && s.Substring(0,4) == "ABCD")
{
switch(s.Length)
{
case 190 :
ReceiveDataEventArgs reda = receData(ref s);
if (ReceiveDataEvent != null) ReceiveDataEvent (reda);
s = "";
break;
case 168 :
break;
}
}
}
public ReceiveDataEventArgs receData(ref string s)
{
dataevent.dataHead = s.Substring(0,4); //解析字头
dataevent.dataNum = byte.Parse(s.Substring(4,2)); //序号
dataevent.receiveFlag = short.Parse(s.Substring(6,4)); //标志位
dataevent.ctrlFlag = Convert.ToInt32(s.Substring(10,2),16);
dataevent.dateTime = s.Substring(12,10); //日期时间
dataevent.sendQuantum = Convert.ToByte(s.Substring(22,2),16); //发送量
dataevent.receiveQuantum = Convert.ToByte(s.Substring(23,2),16); //返回量
dataevent.on_off = Convert.ToByte(s.Substring(26,2),16); //门开关
..............................................
return dataevent;
}
1.协议三条数据分别是, 190个字符!200字符,。。2.字头ABCD,先拿第一条数据来说 190字符,只能拿这两个数据来判断一条命令了,总之这个协议定不不好
3.ABCD后面的字符,3131=控制返回命令, 3232=读电流, 3333= 读电表, 比如ABCD3232.....(共190字符长度),而且我的协议只能靠固定的位来判断每个字节是做什么用的(中间没有,或者分隔符,只能截取)程序写法
我的字符从串口是一个字符一个字符来的,比如先来A,在来B.......
请问我的程序 OnRxChar(ref byte c)函数里或者其他里,应该怎么写才能提高效率,并且保证数据不丢失.希望大家指教.
protected override void OnRxChar(ref byte c)
{
s += new string((char)c,1);//转换string
if(s.StartsWith("ABCD") && s.Substring(0,4) == "ABCD")
{
switch(s.Length)
{
case 190 :
ReceiveDataEventArgs reda = receData(ref s);
if (ReceiveDataEvent != null) ReceiveDataEvent (reda);
s = "";
break;
case 168 :
break;
}
}
}
public ReceiveDataEventArgs receData(ref string s)
{
dataevent.dataHead = s.Substring(0,4); //解析字头
dataevent.dataNum = byte.Parse(s.Substring(4,2)); //序号
dataevent.receiveFlag = short.Parse(s.Substring(6,4)); //标志位
dataevent.ctrlFlag = Convert.ToInt32(s.Substring(10,2),16);
dataevent.dateTime = s.Substring(12,10); //日期时间
dataevent.sendQuantum = Convert.ToByte(s.Substring(22,2),16); //发送量
dataevent.receiveQuantum = Convert.ToByte(s.Substring(23,2),16); //返回量
dataevent.on_off = Convert.ToByte(s.Substring(26,2),16); //门开关
..............................................
return dataevent;
}
解决方案 »
- LINQ查询两个字段相同,一个字段递增
- 【200顶着有分,急】WebBrowser控件编辑模式CTRL+Z失效的问题 或 怎样禁止弹出文档已修改对话框?
- 大型服务器相关问题,
- 急
- 不明白???
- C++.NET+SQL SERVER 出现错误:ADO.RecordSet,在此环境下不允许操作!有哪位高人遇到过这个问题啊?请赐教!
- 请web服务器端程序编写问题
- 如何使用C#实现O/R Mapping?
- 由于宽带改造长时间未能来此,特开贴以答谢各大虾!!!
- 关于类反射(System.Reflection)的一个问题, 急急急!!!
- 服务器资源管理器中无法创建创建数据连接???
- .net 2005 与 2003 下的C#开发 CS项目效率(执行效率)有多少改善?
要判断很多次.而且其他方面处理的不好.效率不行.希望有效率高的代码,谢谢大家帮忙
如果接连出现ABCD,就置TRUE,如果true,就处理可以用char[],不一定非得用string
顺便说明一下我的代码很不好,if(s.StartsWith("ABCD") && s.Substring(0,4) == "ABCD") 要判断很多次.而且其他方面处理的不好.效率不行.希望有效率高的代码,谢谢大家帮忙=======================================
这句是不是有点重复判断了
s.StartsWith("ABCD") 和 s.Substring(0,4) == "ABCD" 不是一样的结果吗你在程序中的把ref string类型的s可以考虑用其他的引用类型,本身string类型的数据在处理的时候就是效率非常低下的,虽然string类型也是引用类型,但是对string类型数据操作是相当耗费资源的
.NET里面很难做这种optimization用了StringBuilder可以提高不少性能,但我估计还是比较慢(当然,这不是绝对的,取决于你对性能要求的预期)