我串口设置为 9600,8,1,none,none,
发现如果用串口接收虚拟串口发出的数据,则是全部一瞬间收到,但是,如果是用单片机发送数据的话。就发现每次只能接收到8个字节丢调用一次serialPort_DataReceived事件,结果。每次都只能收到8个字节,
程序如下
public delegate void _SafetrTextCall(string text);
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int DateLenth = serialPort.BytesToRead;
int i = 0;
string datanum = null;
StringBuilder sb = new StringBuilder();
while (i < DateLenth)
{
byte[] bt = new byte[1024];
int len = serialPort.Read(bt, 0, 1024);
sb.Append(Encoding.ASCII.GetString(bt, 0, len));
i += len;
}
datanum = sb.ToString();
safetrText(datanum);
}
string k=null;
#region safetrText
/// <summary>
/// /// </summary>
/// <param name="text">接收到的数据</param>
private void safetrText(string text)
{
try
{ if (this.InvokeRequired)
{
_SafetrTextCall call =
delegate(string s)
{
if (s != null)
{
k = k + s;
this.textBox1.Text = k;
this.textBox2.Text = (k.Length).ToString();
}
};
this.Invoke(call, text); }
}
catch
{
return;
}
}
#endregion
用以上方法可以将整个数据都接收起来并显示。可是我总是觉得有些问题,希望各位大大能给点好建议
以上是接收字符串的写法。如何接收字节(byte)数组,也是一个难题。还有个问题是可有人知道如何接收到的字节连接起来?
我需要得到的是字节数组各位如果都是只知道字符串的就不要回答了。
例如 serialPort.ReadExisting();serialPort.ReadLine()等等就不用说了
发现如果用串口接收虚拟串口发出的数据,则是全部一瞬间收到,但是,如果是用单片机发送数据的话。就发现每次只能接收到8个字节丢调用一次serialPort_DataReceived事件,结果。每次都只能收到8个字节,
程序如下
public delegate void _SafetrTextCall(string text);
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int DateLenth = serialPort.BytesToRead;
int i = 0;
string datanum = null;
StringBuilder sb = new StringBuilder();
while (i < DateLenth)
{
byte[] bt = new byte[1024];
int len = serialPort.Read(bt, 0, 1024);
sb.Append(Encoding.ASCII.GetString(bt, 0, len));
i += len;
}
datanum = sb.ToString();
safetrText(datanum);
}
string k=null;
#region safetrText
/// <summary>
/// /// </summary>
/// <param name="text">接收到的数据</param>
private void safetrText(string text)
{
try
{ if (this.InvokeRequired)
{
_SafetrTextCall call =
delegate(string s)
{
if (s != null)
{
k = k + s;
this.textBox1.Text = k;
this.textBox2.Text = (k.Length).ToString();
}
};
this.Invoke(call, text); }
}
catch
{
return;
}
}
#endregion
用以上方法可以将整个数据都接收起来并显示。可是我总是觉得有些问题,希望各位大大能给点好建议
以上是接收字符串的写法。如何接收字节(byte)数组,也是一个难题。还有个问题是可有人知道如何接收到的字节连接起来?
我需要得到的是字节数组各位如果都是只知道字符串的就不要回答了。
例如 serialPort.ReadExisting();serialPort.ReadLine()等等就不用说了
解决方案 »
- 窗体程序调用WCF,提示:调用方未由服务进行身份验证
- 客户端上传图片到服务器怎么实现自动压缩图片的大小那??
- 向Excel学习,如何让DataGridView(WinForm)实现Excel的一个功能
- 关于 枚举数遍历的小问题!
- #############SelectCommand的Parameters设置问题
- 如何获取DataSet某个表中 各个字段长度(急。急。急。急。分不是问题,解决问题才是最好的)
- 问个判断登陆的问题!!
- 关于SqlDataAdapter的问题,请帮忙!
- 在线急切求助!!!
- C# 面试题 求大神们解决一下
- winfrom设计器 控件移位画对齐线?
- DateTime比较问题
然后你自己处理不就得了
一般都byte[] 全部存在这里面就可以了,然后解析,但是c#串口也不是很完善,有时候接收不完,
private List<byte> buffer = new List<byte>(4096);
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int DateLenth = serialPort.BytesToRead;
string tmpstr = null, strdata=null;
#region 缓存方法
byte[] buf = new byte[DateLenth];
serialPort.Read(buf, 0, DateLenth);
buffer.AddRange(buf);
#endregion
byte[] bytesData = new byte[buffer.Count];
for (int i = 0; i < buffer.Count; i++)
{
bytesData[i] = (byte)buffer[i];
}
//buffer.
tmpstr = Encoding.ASCII.GetString(bytesData);
//假设以A为开始,B为结尾 本人愚笨。只能想到这个方法
int w1 = tmpstr.IndexOf("A", 0);
int w2 = tmpstr.IndexOf("B");
int ww1 = tmpstr.LastIndexOf("A");
int ww2 = tmpstr.LastIndexOf("B"); if (w1 >= 0 && ww2 > w1 && tmpstr.Length > 6)
{
strdata = tmpstr.Substring(w1, ww2 + 1 - w1);
byte[] bytedata = new byte[ww2 + 1 - w1];
for (int i = 0; i < w2 - w1 + 1; i++)
{
bytedata[i] = bytesData[i + w1];
}
buffer.Clear();
safemingltrText(strdata);
}
}