我想从c#向串口监视器发送两个号码。但是当我顺序发送数字时,端口没有工作 我的c#代码:
if (serialPort1.IsOpen)
{
int MyInt = Convert.ToInt32(textBox1.Text);
byte[] b = BitConverter.GetBytes(MyInt);
serialPort1.Write(b, 0, 4);
if (MyInt == 3)
{
int MyInt2 = Convert.ToInt32(textBox2.Text);
byte[] s = BitConverter.GetBytes(MyInt2);
serialPort1.Write(s, 0, 4);
}
else
{
MessageBox.Show("Continue");
}
}
else
{
MessageBox.Show("Please check your connction maybe serial port is not connected");
}
和Arduino代码:
int LedPin = 12;
int k, s;
void setup()
{
Serial.begin(9600);
pinMode(LedPin, OUTPUT);
}
void loop()
{
if (Serial.available())
{
k = Serial.read();
switch (k)
{
case 1:
openCloseThree();
break;
case 2:
openCloseTwice();
break;
case 3:
s = Serial.read();
if (s !=0)
{
openCloseIwanted();
}
break;
default:
openCloseIwanted();
break;
}
}
}
void openClose()
{
for (int i = 0; i < 1; i++)
{
delay(500);
digitalWrite(LedPin, HIGH);
delay(500);
digitalWrite(LedPin, LOW);
}
}
void openCloseTwice()
{
for (int i = 0; i < 2; i++)
{
delay(500);
digitalWrite(LedPin, HIGH);
delay(500);
digitalWrite(LedPin, LOW);
}
}
void openCloseThree()
{
for (int i = 0; i < 3; i++)
{
delay(500);
digitalWrite(LedPin, HIGH);
delay(500);
digitalWrite(LedPin, LOW);
}
}
void openCloseIwanted()
{
s = Serial.read();
for (int i = 0; i < s ; i++)
{
delay(500);
digitalWrite(LedPin, HIGH);
delay(500);
digitalWrite(LedPin, LOW);
}
}
我的关键数字是3.我想在发送3和5时看到led开 - 关,例如,led必须打开 - 关闭5次。 请帮帮我!
答案 0 :(得分:2)
我解决了我的问题,我想在这里分享。 我的arduino部分:
int number[3];
int n;
int i = 0;
int led = 12;
int led2=7;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
if (Serial.available() > 0) {
// read the incoming byte:
n = Serial.read();
if (i < 3)
{
number[i] = n;
switch (number[0])
{
case 1:
openClose();
break;
case 2:
openCloseTwice();
break;
case 3:
if (i == 2)
{
for (int j = 0; j < number[1]; j++)
{
delay(500);
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
}
delay(500);
for (int k = 0; k < number[2]; k++)
{
delay(500);
digitalWrite(led2, HIGH);
delay(500);
digitalWrite(led2, LOW);
}
}
break;
default:
break;
}
i++;
}
else
{
i = 0;
}
}
}
void openClose()
{
for (int i = 0; i < 1; i++)
{
delay(500);
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
}
}
void openCloseTwice()
{
for (int i = 0; i < 2; i++)
{
delay(500);
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
}
}
和我的c#部分:
if (serialPort1.IsOpen)
{
int MyInt = Convert.ToInt32(textBox1.Text);
byte[] b = BitConverter.GetBytes(MyInt);
serialPort1.Write(b, 0, 1);
int MyInt2 = Convert.ToInt32(textBox2.Text);
byte[] z = BitConverter.GetBytes(MyInt2);
serialPort1.Write(z, 0, 1);
int MyInt3 = Convert.ToInt32(textBox3.Text);
byte[] p = BitConverter.GetBytes(MyInt3);
serialPort1.Write(p, 0, 1);
}
else
{
MessageBox.Show("Please control your connection");
}
感谢您的帮助。
答案 1 :(得分:0)
您的代码中有3个问题。
您在此处致电Serial.read()
:
case 3:
s = Serial.read();
if (s !=0)
{
openCloseIwanted();
}
但实际上你并不知道byte
是否已经Serial
已经可用。
您在此处再次致电 Serial.read()
:
void openCloseIwanted()
{
s = Serial.read();
for (int i = 0; i < s ; i++)
{
delay(500);
digitalWrite(LedPin, HIGH);
delay(500);
digitalWrite(LedPin, LOW);
}
}
不检查byte
上Serial
是否可用。
您在4 bytes
源代码中发送了C#
,而不是1
:
if (MyInt == 3)
{
int MyInt2 = Convert.ToInt32(textBox2.Text);
byte[] s = BitConverter.GetBytes(MyInt2);
serialPort1.Write(s, 0, 4);
}
根据write()
的{{3}}。如果您发送4 bytes
,则不应只读1
,甚至2
,但必须采用独立/不相关的方式。
如果你发送4 bytes
,那么你应该:
等待输入中至少4 bytes
可用:
while (Serial.available() < 4) { };
然后将这些字节存储到long
变量中:
unsigned long lvar = 0;
for (byte i = 0; i < 3; ++i) {
lvar = (lvar << 8) + (byte) Serial.read();
}
您需要unsigned long
,因为 Arduino 上的int
只有2
个字节。
然后将lval
作为参数传递给您的函数void openCloseIwanted(unsigned long lval)
或许更好的解决方案是仅在1 byte
代码中发送C#
,我不认为您需要超过255
眨眼,是吗?
请注意,修复case 3:
中的代码可能不够,因为您第一次发送4 bytes
1, 2, 3
。根据架构的字节endianess ,0
中原始int
的前导C#
可能会在阅读{{1}之前或之后解析包含byte
。这意味着您可能会通过1, 2, 3
获得可能未对齐的数据读取。
为什么不发送/接收以 ASCII 表示编码的值,而不是尝试执行二进制输入/输出?这应该更容易处理。