关于c#用serial port发送信息
答案:4 悬赏:10 手机版
解决时间 2021-03-26 23:42
- 提问者网友:椧運幽默
- 2021-03-26 09:29
关于c#用serial port发送信息
最佳答案
- 五星知识达人网友:夜余生
- 2021-03-26 10:22
//--------------------------------------------
// 利用集合List来拼接数据帧比较方便
// 过程见以下代码
private void ConvertAndSend_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
List TxBuffer = new List();
string[] coords = textBox1.Text.Split('
');
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 TxBuffer = new List();
//帧起始标志
TxBuffer.Add(0x5A);
//命令字节
TxBuffer.Add(Instruction);
string[] coords = textBox1.Text.Split('
');
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);
}
}追问大神,还是分开发的,,麻烦你了啊!追答您说的:“还是分开发的……”是什么意思呀?
按照上面的程序,构造处理的待发送字节数组个格式如下图所示
执行以下代码
byte[] t = TxBuffer.ToArray();
serialPort.Write(t, 0, t.Length);
图示的字节数组应该是一次发送的呀!
追问你好我没表达清楚,抱歉!现在的程序的确就是你如上所说的那样,需要的是:在instruction之后,显示这个buffer里面的总字节数,然后data,最后2c。还有另外一个问题就是,原来旧的程序应该是在接受端把收到的data从byte转换为hex并显示,同时也转换为float,并显示为string的,但是在您最新修改的程序里,并不显示float了,只显示hex。我的接受程序在上面的回复里有链接。
// 利用集合List
// 过程见以下代码
private void ConvertAndSend_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
List
string[] coords = textBox1.Text.Split('
');
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
//帧起始标志
TxBuffer.Add(0x5A);
//命令字节
TxBuffer.Add(Instruction);
string[] coords = textBox1.Text.Split('
');
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);
}
}追问大神,还是分开发的,,麻烦你了啊!追答您说的:“还是分开发的……”是什么意思呀?
按照上面的程序,构造处理的待发送字节数组个格式如下图所示
执行以下代码
byte[] t = TxBuffer.ToArray();
serialPort.Write(t, 0, t.Length);
图示的字节数组应该是一次发送的呀!
追问你好我没表达清楚,抱歉!现在的程序的确就是你如上所说的那样,需要的是:在instruction之后,显示这个buffer里面的总字节数,然后data,最后2c。还有另外一个问题就是,原来旧的程序应该是在接受端把收到的data从byte转换为hex并显示,同时也转换为float,并显示为string的,但是在您最新修改的程序里,并不显示float了,只显示hex。我的接受程序在上面的回复里有链接。
全部回答
- 1楼网友:封刀令
- 2021-03-26 13:12
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。
谢谢!
- 2楼网友:三千妖杀
- 2021-03-26 13:05
你好!那你就把多个 Data 先合并到一起追问请问怎么合?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯