我能否在C#中通过串口发送一个整数?

4

我能否在C#中通过串口发送int类型的数据?

我开发了一个使用C#编写的应用程序,通过串口向Arduino发送数据。这些数据是一个命令,只能是int类型!不是字符串! 我该怎么做?我读取了一些字节,但是我不明白。

using System;
using System.Windows.Forms;
//
using System.Threading;
using System.IO;
using System.IO.Ports;

pulic class senddata(){

private void Form1_Load(object sender, System.EventArgs e)
{
//Define a Porta Serial
    serialPort1.PortName = textBox2.Text;
    serialPort1.BaudRate = 9600;
    serialPort1.Open();
}
private void button1_Click(object sender, System.EventArgs e)
{
     serialPort1.Write("1");  // "1" is a string, but i put 1 (int) give me a error.       
}

}

Arduino代码如下:
#include <Servo.h>

void setup()
{
    servo.attach(9);
    Serial.begin(9600);
    pinMode(13, OUTPUT);
}

void loop()
{
    if(Serial.available())
    {

      int cmd = (unsigned char)Serial.read();

      if(cmd == 91){
        digitalWrite(13,HIGH);
      }
    }
}
2个回答

4
要写入一个值为1的4字节整数,你需要先将它转换为字节数组。我使用BitConverter来完成这个过程。你也可以使用Convert.ToByte,类似@sll所示。
注意,在发送数据到串行端口时,指定要发送多少个字节非常重要。是一个4字节的整数?2字节?还是单字节?在你的问题中好像没有指定。
int MyInt = 1;

byte[] b = BitConverter.GetBytes(MyInt);
serialPort1.Write(b,0,4);

这将写入一个32位整数,但代码期望一个8位整数(在C中为char)。 - Guffa
@FredVaz:你应该开始接受对你问题的回答。请检查你最喜欢的答案旁边的“勾选标记”。 - abelenky
@Guffa:正如我所提到的,我在问题中没有看到任何指定他想要单个字节还是4字节整数的内容。但更改非常微不足道。 - abelenky
如果它确实是一个多字节值,那么你还需要知道它是小端序还是大端序。 - Guffa
8位整数等于一个字节吗?那为什么不直接创建一个一字节的数组然后写入呢? - Peter

2
您可以使用另一个重载方法:(MSDN)
public void Write(
    byte[] buffer,
    int offset,
    int count
)

// number should be positive value less than 256
int number = 20;
byte[] buffer = new byte[] { Convert.ToByte(number) };
serialPort.Write(buffer, 0, 1);

这将从缓冲区中写出一个单字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接