[英]How exactly does Serial port write actually write the data from the buffer?
因此,我正在使用Visual Studios Windows窗体创建GUI,以便将数据发送到Arduino。 我一直在测试如何在Arduino端接收数据,但似乎找不到关于如何发送数据的解释。 我一直在使用port.Write()
发送缓冲区。
从Microsoft页面 port.Write
信息
Arduino串行监视器读取ASCII字符,但是由于我使用的是GUI与Arduino通讯,因此我不确定如何传输数据。 在Arduino串行监视器中,我输入数据,然后按Enter。 这意味着,如果我输入了所有数据并按Enter,它将读取所有数据为1个字节。 通过分别输入数据,然后输入,将读取一个字节并以换行符终止。
数据传输到底如何? 从MS页面开始,因为它说“它使用来自缓冲区的数据将指定数量的字节写入串行端口”,我假设它是同时发送所有字节的,而不是单独发送的。
即如果我将数据作为port.Write(new byte[] { b0, b1, b2, b3, b4, b5, b6, b7}, 0, 8);
发送port.Write(new byte[] { b0, b1, b2, b3, b4, b5, b6, b7}, 0, 8);
它是基本上一次发送全部8个字节,还是单独发送每个元素,如果是,字节之间的终止是什么? 我认为这是第一个,因为它要求写入的字节数(计数),因此它从数组发送8个字节。
传输期间字节之间会终止什么? 逗号分隔数组数据,但在传输时,它是否甚至发送逗号来终止或只是数据流?
即。 在运行代码的串行监视器中,我分别输入每个字节,然后输入换行符。 然后,Arduino读取字节,直到遇到换行符
在C ++中的Arduino上,您可以使用Serial.print或Serial.println使其自动应用新行。 在MS页面上,WriteLine方法仅写入一个字符串,并且没有任何重载,因此我认为这意味着无法通过此命令使用字节吗?
如果我尝试使用for循环打印单个数组,则表示无法从byte
转换为char[]
。 当我将其定义为字节数组时,为什么说它是一个char数组? 我以前使用// // port.Write(sendbyte, 0, 8);
发送整个数组并获取一些数据。
从Windows Form GUI发送的代码:
//bytes declared and data stored earlier
byte[] sendbyte = new byte[] { b1, b2, b3, b4, b5, b6, b7, b8};
port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
port.Open();
//port.Write(sendbyte, 0, 8);
port.Write(new byte[] { b1, b2, b3, b4, b5, b6, b7, b8}, 0, 8);
/*for( int x = 0; x <=7; x ++)
{
port.Write( sendbyte[x], 0, 1);
}
*/
port.Close();
读取传入字节的代码
void recvBytesWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
byte startMarker = 42;
byte endMarker = 24;
byte rb;
byte comp;
while (Serial.available() > 0 && newData == false)
{
rb = Serial.read();
if (recvInProgress == true)
{
if (rb != endMarker)
{
receivedBytes[ndx] = rb;
ndx++;
if (ndx >= numBytes)
{
ndx = numBytes - 1;
}
}
else
{
receivedBytes[ndx] = ','; // terminate the string
recvInProgress = false;
numReceived = ndx; // save the number for use when printing
ndx = 0;
newData = true;
}
}
else if (rb == startMarker)
{
recvInProgress = true;
}
}
}
串行端口通常是缓冲的,但是Microsoft文档使我相信它会将整个缓冲区一次全部写到线路上,因为它可能会引发超时异常。 但是,如果您一次从窗口写入1000个字节,则不能保证在arduino的每个循环中读取相同数量的字节。
各个字节之间没有定界符。 分隔数组字节的逗号实际上只是您编程语言的语法,即。 它仅存在于您的代码文件中。 字节始终按顺序排列在内存中。
除非您将字节数组转换为字符串值,否则不会。 如何将字节数组转换为字符串
尝试port.Write(&sendByte [x],0,1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.