[英]how to send two number in serial port sequential using c#
我想將兩個數字從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必須開閉五次。 請幫我!
我解決了我的問題,我想在這里分享。 我的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");
}
謝謝你的幫助。
您的代碼中有3個問題。
您在這里調用Serial.read()
:
case 3: s = Serial.read(); if (s !=0) { openCloseIwanted(); }
但實際上您不知道Serial
上是否已有byte
。
您在這里再次調用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
上是否可用。
您在C#
源代碼中發送了4 bytes
,而不是1
4 bytes
:
if (MyInt == 3) { int MyInt2 = Convert.ToInt32(textBox2.Text); byte[] s = BitConverter.GetBytes(MyInt2); serialPort1.Write(s, 0, 4); }
根據write()
的文檔 。 如果發送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)
也許更好的解決方案是僅在C#
代碼中發送1 byte
,我認為您不需要超過255
閃爍,是嗎?
請注意,這可能不足以修復代碼case 3:
因為您發送4 bytes
的第一次圍繞也為1, 2, 3
。 根據您的體系結構的字節序 ,可能會在讀取包含1, 2, 3
的byte
之前或之后解析C#
原始int
的前導0
。 這意味着您可能會通過Serial
獲得未對齊的數據讀取。
為什么不發送/接收以ASCII表示形式編碼的值,而不是嘗試執行二進制輸入/輸出? 那應該更容易處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.