关于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里面发送。 请问怎么改?
展开
 我来答
mmxx464010
2014-09-12
知道答主
回答量:23
采纳率:0%
帮助的人: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。
谢谢!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
freeeeeewind
2014-09-12 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1350万
展开全部
//--------------------------------------------
// 利用集合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);
            }
        }
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cjj796
2014-09-12 · TA获得超过8709个赞
知道大有可为答主
回答量:1.3万
采纳率:68%
帮助的人:3460万
展开全部
你好!那你就把多个 Data 先合并到一起
追问
请问怎么合?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
syht2000
高粉答主

2014-09-12 · 关注我不会让你失望
知道大有可为答主
回答量:3万
采纳率:79%
帮助的人:1.4亿
展开全部
这里面有一些问题,从上面看你的协议是 5a xx len data 2c

如果你要将多个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);
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式