每次和硬件層進行調試的時候,就容易遇到數據格式問題。這不,繼上次Matlab上的hex發送後,又遇到了Arduino上接收hex,並進行對比處理的問題。因爲單片機級別的處理器只能以字節形式接收,所以沒法使用緩存和字符串的形式進行讀取判斷。網上找來找去,終於找到一個相似的,加以修改,就成了知足咱們測試需求了。如下是源碼。git
byte variable[80];
byte index = 0;
byte forward[] = {0xC2, 0x9A, 0x01, 0x00, 0x09, 0xDC, 0x05, 0x24, 0xFA, 0x75};
int j = 0;
/////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
delay(1000);
}
/////////////////////////////////////////////////////////////
void loop() {
while (Serial.available() > 0) {
byte b = Serial.read();
variable[index++] = b;
if (index == 10) {
//Serial.print(variable[0], HEX);Serial.println(variable[1], HEX);
//if (variable[0] == 0x40 && variable[1] == 0x05) {
//Serial.println("Matched!!!");
for(int i=0; i < index; i++){
if(variable[i] == forward[i]){
j++;
}
}
if(j == 10){
Serial.println("Matched!!!");
j=0;
}
else Serial.println("Not Matched!");
index = 0;
j = 0;
}
}
}
再更新一版,能夠隨意字節長度,只要包含對的數組,就能識別,再也不由於以前輸入的數組長度干擾後面正確的數組識別。其實就是將數組左移,保證數組第一個能匹配,而後再進行後面的讀取,這樣就能將中間不對的字節逐漸剔除掉。話很少說,上源碼,此次帶上了LED燈的指示。
#define LED 13
byte variable[80];
byte index = 0;
byte forward[] = {0xC2, 0x9A, 0x01, 0x00, 0x09, 0xDC, 0x05, 0x24, 0xFA, 0x75};
int j = 0;
/////////////////////////////////////////////////////////////
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
delay(1000);
}
/////////////////////////////////////////////////////////////
void loop() {
while (Serial.available() > 0) {
byte b = Serial.read();
variable[index++] = b;
xunhuan:
if((variable[0] != forward[0]) && index >= 1 ){
for(int i=0; i < index; i++)
{
variable[i] = variable[i+1];
}
index--;
goto xunhuan;
}
if (index >= 10) {
//Serial.print(variable[0], HEX);Serial.println(variable[1], HEX);
//if (variable[0] == 0x40 && variable[1] == 0x05) {
//Serial.println("Matched!!!");
for(int i=0; i<10; i++){
if(variable[i] == forward[i]){
j++;
}
}
if(j == 10){
Serial.println("F+000000025+000000025A");
j=0;
digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
else Serial.println("F00000000000000000000A");
index = 0;
j = 0;
}
}
}