关于c#用serial port发送信息
privatevoidConvertAndSend_Click(objectsender,EventArgse){if(serialPort.IsOpen){byte[]...
private void ConvertAndSend_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
byte[] TxBuffer = new byte[240];
string[] coords = textBox1.Text.Split('\n');
for (int i = 0; i <= coords.Length - 1; i++)
{
if (coords[i].Length > 0)
{
Data = GetValue(coords[i]);
TxBuffer[0] = 0x5A;
TxBuffer[1] = Instruction;
TxBuffer[2] = (byte)Data.Length;
Data.CopyTo(TxBuffer, 3);
TxBuffer[Data.Length + 3] = 0x2C;
serialPort.Write(TxBuffer, 0, 4 + Data.Length);
}
}
}
}
现在我的代码作用是:如果只有一个“Data”,会发送一个Txbuffer,如果有多个“Data”,就发送多个Txbuffer。 我想把它改成:不管有多少“Data”,都综合在同一个Txbuffer里面发送。 请问怎么改? 展开
{
if (serialPort.IsOpen)
{
byte[] TxBuffer = new byte[240];
string[] coords = textBox1.Text.Split('\n');
for (int i = 0; i <= coords.Length - 1; i++)
{
if (coords[i].Length > 0)
{
Data = GetValue(coords[i]);
TxBuffer[0] = 0x5A;
TxBuffer[1] = Instruction;
TxBuffer[2] = (byte)Data.Length;
Data.CopyTo(TxBuffer, 3);
TxBuffer[Data.Length + 3] = 0x2C;
serialPort.Write(TxBuffer, 0, 4 + Data.Length);
}
}
}
}
现在我的代码作用是:如果只有一个“Data”,会发送一个Txbuffer,如果有多个“Data”,就发送多个Txbuffer。 我想把它改成:不管有多少“Data”,都综合在同一个Txbuffer里面发送。 请问怎么改? 展开
4个回答
展开全部
private void ConvertAndSend_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
byte[] TxBuffer = new byte[240];
string coords = textBox1.Text.Trim();
TxBuffer[0] = 0x5A; //这是头检测部分??
TxBuffer[1] = Instruction;
TxBuffer[2] = (byte)Data.Length;
for (int i = 0; i < coords.Length; i++)
{
if (coords[i].Length > 0)
{
Data = GetValue(coords[i]);
if( TxBuffer.Length < 240) //防止越界
Data.CopyTo(TxBuffer, TxBuffer.Length);
else
break; //这里越界了 你自行处理
}
}
try
{
TxBuffer[TxBuffer.Length + 3] = 0x2C; //这个应该是结束标志吧
serialPort.Write(TxBuffer, 0, TxBuffer.Length);
}
catch
{
//这里可能会有异常 因为上面TxBuffer[TxBuffer.Length + 3]可能会越界,这里我就不做处理
}
}
}
这是我对您提问的处理,希望能对您有帮助!!
追问
你好!你的程序很详细哈,不过有两个报错。
if (coords[i].Length > 0)-----------char不包括length这个definition。
Data = GetValue(coords[i]);-------不可以把char转换为string。而且有不成立的argument。
谢谢!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//--------------------------------------------
// 利用集合List<byte>来拼接数据帧比较方便
// 过程见以下代码
private void ConvertAndSend_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
List<byte> TxBuffer = new List<byte>();
string[] coords = textBox1.Text.Split('\n');
for (int i = 0; i <= coords.Length - 1; i++)
{
if (coords[i].Length > 0)
{
byte[] Data = GetValue(coords[i]));
TxBuffer.Add(0x5A);
TxBuffer.Add(Instruction);
TxBuffer.Add((byte)Data.Length);
TxBuffer.AddRange(Data);
TxBuffer.Add(0x2C);
}
}
//拼接完毕后,转换成字节数组并一次发送
byte[] t = TxBuffer.ToArray();
serialPort.Write(t, 0, t.Length);
}
}
更多追问追答
追问
你好!谢谢你的回答!我试了你的代码,可还是和原来一个效果。就是每个data都是在独立的bufeer里面发送的
追答
修改:
private void ConvertAndSend_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
List<byte> TxBuffer = new List<byte>();
//帧起始标志
TxBuffer.Add(0x5A);
//命令字节
TxBuffer.Add(Instruction);
string[] coords = textBox1.Text.Split('\n');
for (int i = 0; i <= coords.Length - 1; i++)
{
if (coords[i].Length > 0)
{
byte[] Data = GetValue(coords[i]));
TxBuffer.Add((byte)Data.Length);
TxBuffer.AddRange(Data);
}
}
//帧结束标志
TxBuffer.Add(0x2C);
//拼接完毕后,转换成字节数组并一次发送
byte[] t = TxBuffer.ToArray();
serialPort.Write(t, 0, t.Length);
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你好!那你就把多个 Data 先合并到一起
追问
请问怎么合?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这里面有一些问题,从上面看你的协议是 5a xx len data 2c
如果你要将多个data合起来,那不同的data之间如何区分?
如果你要将多个data合起来,那不同的data之间如何区分?
更多追问追答
追问
你好!我要发送的的确是 5a instruction 长度 data 2c。我觉得不需要考虑区分的问题吧,因为我在接受的时候是每8个bytes转换一次(因为我一个坐标,也就是发送的data刚好是8bytes)。这个是我接收的代码 ,谢谢! http://zhidao.baidu.com/question/1830593700089108540.html?quesup2&oldq=1
追答
手打的,可能有错,基本就这个意思了
if (serialPort.IsOpen)
{
List<byte> TxBuffer = new List<byte>();
TxBuffer.Add(0x5A);
TxBuffer.Add(Instruction);
TxBuffer.Add(0x00);//长度位,暂存
string[] coords = textBox1.Text.Trim().Split(new char[]{'\n','\r'},StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i <= coords.Length - 1; i++)
TxBuffer.AddRange(GetValue(coords[i].Trim()));
TxBuffer.Add(0x2c);
TxBuffer[2]=(byte)(coords.Length*8);//数据长度,我不清楚你那个GetValue返回的倒底是什么,这里是按返回8字节来算的
serialPort.Write(TxBuffer.ToArray(), 0, TxBuffer.Count);
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询