首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino不向WinForms应用程序发送数据

Arduino不向WinForms应用程序发送数据
EN

Stack Overflow用户
提问于 2021-01-05 19:49:51
回答 1查看 57关注 0票数 1

我有一个Arduino Leonardo,它有一个程序,它监听串行端口并执行发送给它的命令。Arduino设备是一个RFID读取器。

我写了一个WinForms应用程序,它与RFID阅读器通信以验证用户身份。Arduino可以正常接收数据,但不发送任何内容。即使是电路板上的发送二极管也不亮。

我用另一台PC串行显示器测试了我的阅读器,它工作得很好,所以问题出在我的应用程序上。波特率为9600,数据位为8,奇偶校验为none。握手可能无关紧要,因为串行监视器可以与任何握手一起工作。

我做错了什么?另一件奇怪的事是,当我通过RS232将装有我的应用程序的PC连接到另一台装有串行显示器的PC时,我模拟了我的阅读器,一切都正常工作。那么,为什么只有我的应用程序和Arduino不能工作,而所有其他组合都能工作呢?

Arduino设备是唯一的Arduino + MFRC522阅读器。

应用程序代码:

代码语言:javascript
复制
        public static Status Authenticate(Key key, Passsword passwd, UID uid, string port)
        {
            SerialPort serial = new SerialPort(port, 9600, Parity.None, 8, StopBits.One);
            serial.Handshake = Handshake.None;

            serial.Open();

            byte[] cmd = { 1 };

            serial.Write(cmd, 0, 1); //Send command

            if (serial.ReadLine() != "START") //Device is ready
            { serial.Close(); return Status.Err; }

            if (serial.ReadLine() != "KEY") //Device requires key
            { serial.Close(); return Status.Err; }

            serial.Write(key.ToArray(), 0, 6); //Send key

            if (serial.ReadLine() != "PASSWD") //Device requires password
            { serial.Close(); return Status.Err; }

            serial.Write(passwd.ToArray(), 0, 16); //Send password

            if (serial.ReadLine() != "UID") //Device requires card UID
            { serial.Close(); return Status.Err; }

            serial.Write(uid.ToArray(), 0, 4); //Send UID

            if (serial.ReadLine() != "WAIT-CARD") //Wait
            { serial.Close(); return Status.Err; }

            if (serial.ReadLine() != "CARD-PRESENT") //User presented card
            { serial.Close(); return Status.Err; }

            string stat = serial.ReadLine(); //Receive authorization status

            serial.Close();

            switch (stat) //Check status
            {
                case "OK": return Status.OK;
                case "ERR-PASS": return Status.Inc_passwd;
                case "ERR-UID": return Status.Inc_uid;
                case "ERR-KEY": return Status.Inc_key;
                default: return Status.Err;
            }

完整的Arduino代码:

代码语言:javascript
复制
#include <MFRC522.h>
#include <SPI.h>
#include <EEPROM.h>

#define SECTORS_14

// ----------------------------------------------------------------------------------------------------

#ifdef SECTORS_15
const byte permittedBlocks[] = {8, 9, 10, 12, 13, 14, 16, 17, 18, 20, 21, 22, 24, 25, 26, 28, 29, 30, 32, 33,
  34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 48, 49, 50, 52, 53, 54, 56, 57, 58, 60, 61, 62};
#endif

#ifdef SECTORS_14
const byte permittedBlocks[] = {8, 9, 10, 12, 13, 14, 16, 17, 18, 20, 21, 22, 24, 25, 26, 28, 29, 30, 32, 33,
  34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 48, 49, 50, 52, 53, 54, 56, 57, 58};
#endif

typedef struct codes
{
  byte uid[4];
  byte passwd[16];
  MFRC522::MIFARE_Key key;
} personalData;

void setup() 
{
  Serial.begin(9600);
  SPI.begin();
  delay(1000);
}

void loop() 
{
  byte cmd;
  
  while (!Serial.available());
  cmd = Serial.read();

  switch (cmd)
  {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    case 1:
    {
      digitalWrite(13, HIGH);
      Serial.println("START");
      
      personalData personal = RFID_GetPersonalData();
      
      MFRC522 rfid(10, 9);
      rfid.PCD_Init();

      if (RFID_WaitForCard(&rfid, personal)) return;

      Serial.println("OK");
      rfid.PICC_HaltA();
      rfid.PCD_StopCrypto1();
      
      break;
    }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    case 2:
    {
      Serial.println("START");
      
      personalData personal = RFID_GetPersonalData();
      
      Serial.println("NEW-PASSWD");

      byte newPasswd[16];
      getArray(newPasswd, 16);

      MFRC522 rfid(10, 9);
      rfid.PCD_Init();

      if (RFID_WaitForCard(&rfid, personal)) return;

      Serial.println("CHANGING");

      byte ok = RFID_ChangePasswd(newPasswd, &rfid, personal.key);

      if (ok == 1)      {Serial.println("ERR-KEY");    return;}
      else if (ok == 2) {Serial.println("ERR-WRITE");    return;}

      Serial.println("OK");

      rfid.PICC_HaltA();
      rfid.PCD_StopCrypto1();
      
      break;
    }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    case 3:
    {
      Serial.println("START");
      
      personalData personal = RFID_GetPersonalData();

      Serial.println("TO-WRITE");

      byte count[1];
      getArray(count, 1);

      byte blocks[count[0]][1];
      byte data[count[0]][16];

      for (byte i = 0; i < count[0]; i++)
      {
        Serial.println("BLOCK");

        getArray(blocks[i], 1);

        if (!isBlockPermitted(blocks[i][0])) {Serial.println("BLOCK-INVALID"); return;}

        Serial.println("DATA");

        getArray(data[i], 16);
      }
      

      MFRC522 rfid(10, 9);
      rfid.PCD_Init();

      if (RFID_WaitForCard(&rfid, personal)) return;

      Serial.println("WRITING");

      for (byte i = 0; i < count[0]; i++)
      {
        byte ok = RFID_WriteBlock(data[i], &rfid, personal.key, blocks[i][0]);

        if (ok == 1)      {Serial.println("ERR-KEY");    return;}
        else if (ok == 2) {Serial.println("ERR-WRITE");    return;}
      }
      
      Serial.println("OK");

      rfid.PICC_HaltA();
      rfid.PCD_StopCrypto1();
      
      break;
    }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    case 4:
    {
      Serial.println("START");
      
      personalData personal = RFID_GetPersonalData();

      MFRC522 rfid(10, 9);
      rfid.PCD_Init();

      if (RFID_WaitForCard(&rfid, personal)) return;
      
      Serial.println("FORMATTING");

      byte ok = RFID_FormatCard(&rfid, personal.key);

      if (ok == 1)      {Serial.println("ERR-KEY");    return;}
      else if (ok == 2) {Serial.println("ERR-WRITE");    return;}

      Serial.println("OK");

      rfid.PICC_HaltA();
      rfid.PCD_StopCrypto1();
      
      break;
    }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    case 5:
    {
      Serial.println("START");
      
      personalData personal = RFID_GetPersonalData();

      Serial.println("TO-READ");

      byte count[1];
      getArray(count, 1);

      byte blocks[count[0]][1];

      for (byte i = 0; i < count[0]; i++)
      {
        Serial.println("BLOCK");

        getArray(blocks[i], 1);

        if (!isBlockPermitted(blocks[i][0])) {Serial.println("BLOCK-INVALID"); return;}
      }

      MFRC522 rfid(10, 9);
      rfid.PCD_Init();

      if (RFID_WaitForCard(&rfid, personal)) return;

      Serial.println("READING");

      byte data[count[0]][16];
      for (byte i = 0; i < count[0]; i++)
      {
        byte ok = RFID_ReadBlock(data[i], &rfid, personal.key, blocks[i][0]);

        if (ok == 1)      {Serial.println("ERR-KEY");    return;}
        else if (ok == 2) {Serial.println("ERR-READ");    return;}
      }
      
      for (byte i = 0; i < count[0]; i++)
      {
        Serial.println("BLOCK-" + blocks[i][0]);
        for (byte i2 = 0; i2 < 16; i2++)
          Serial.println(data[i][i2]);
      }

      Serial.println("OK");

      rfid.PICC_HaltA();
      rfid.PCD_StopCrypto1();
      
      break;
    }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    case 6:
    {
      Serial.println("START");
      
      personalData personal = RFID_GetPersonalData();

      Serial.println("TO-READ");

      byte countR[1];
      getArray(countR, 1);

      byte blocksR[countR[0]][1];

      for (byte i = 0; i < countR[0]; i++)
      {
        Serial.println("BLOCK");

        getArray(blocksR[i], 1);

        if (!isBlockPermitted(blocksR[i][0])) {Serial.println("BLOCK-INVALID"); return;}
      }

      Serial.println("TO-WRITE");

      byte countW[1];
      getArray(countW, 1);

      byte blocksW[countW[0]][1];
      byte dataW[countW[0]][16];

      for (byte i = 0; i < countW[0]; i++)
      {
        Serial.println("BLOCK");

        getArray(blocksW[i], 1);

        if (!isBlockPermitted(blocksW[i][0])) {Serial.println("BLOCK-INVALID"); return;}

        Serial.println("DATA");

        getArray(dataW[i], 16);
      }

      MFRC522 rfid(10, 9);
      rfid.PCD_Init();

      if (RFID_WaitForCard(&rfid, personal)) return;

      Serial.println("READING");

      byte dataR[countR[0]][16];
      for (byte i = 0; i < countR[0]; i++)
      {
        byte ok = RFID_ReadBlock(dataR[i], &rfid, personal.key, blocksR[i][0]);

        if (ok == 1)      {Serial.println("ERR-KEY");    return;}
        else if (ok == 2) {Serial.println("ERR-READ");    return;}
      }

      for (byte i = 0; i < countR[0]; i++)
      {
        Serial.println("BLOCK-" + blocksR[i][0]);
        for (byte i2 = 0; i2 < 16; i2++)
          Serial.println(dataR[i][i2]);
      }

      Serial.println("WRITING");

      for (byte i = 0; i < countW[0]; i++)
      {
        byte ok = RFID_WriteBlock(dataW[i], &rfid, personal.key, blocksW[i][0]);

        if (ok == 1)      {Serial.println("ERR-KEY");    return;}
        else if (ok == 2) {Serial.println("ERR-WRITE");    return;}
      }

      Serial.println("OK");

      rfid.PICC_HaltA();
      rfid.PCD_StopCrypto1();
      
      break;
    }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    case 7:
    {
      Serial.println("START");
      Serial.println("TO-WRITE");

      byte count[1];
      getArray(count, 1);
      byte addr[count[0]][1];
      byte val[count[0]][1];

      for (byte i = 0; i < count[0]; i++)
      {
        Serial.println("ADDR");
        getArray(addr[i], 1);

        Serial.println("VAL");
        getArray(val[i], 1);
      }

      for (byte i = 0; i <count[0]; i++)
        EEPROM.put(addr[i][0], val[i][0]);

      Serial.println("OK");
    }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    case 8:
    {
      Serial.println("START");
      Serial.println("TO-READ");

      byte count[1];
      getArray(count, 1);
      byte addr[count[0]][1];
      byte val[count[0]][1];

      for (byte i = 0; i < count[0]; i++)
      {
        Serial.println("ADDR");
        getArray(addr[i], 1);
      }

      for (byte i = 0; i <count[0]; i++)
      {
        EEPROM.get(addr[i][0], val[i][0]);
        Serial.print("READ-"); Serial.println(addr[i][0]);
        Serial.println(val[i][0]);
      }
      
      Serial.println("OK");
    }

    case 9:
    {
      Serial.println("START");
      Serial.println("TO-READ");

      byte countR[1];
      getArray(countR, 1);
      byte addrR[countR[0]][1];
      byte valR[countR[0]][1];

      for (byte i = 0; i < countR[0]; i++)
      {
        Serial.println("ADDR");
        getArray(addrR[i], 1);
      }

      Serial.println("TO-WRITE");

      byte countW[1];
      getArray(countW, 1);
      byte addrW[countW[0]][1];
      byte valW[countW[0]][1];

      for (byte i = 0; i < countW[0]; i++)
      {
        Serial.println("ADDR");
        getArray(addrW[i], 1);

        Serial.println("VAL");
        getArray(valW[i], 1);
      }

      for (byte i = 0; i <countR[0]; i++)
      {
        EEPROM.get(addrR[i][0], valR[i][0]);
        Serial.print("READ-"); Serial.println(addrR[i][0]);
        Serial.println(valR[i][0]);
      }

      for (byte i = 0; i <countW[0]; i++)
        EEPROM.put(addrW[i][0], valW[i][0]);
      
      Serial.println("OK");
    }
  }
}
// -----------------------------------------------------------------------------------------------------------
inline bool compareArray(byte a1[], byte a2[], byte aSize)
{
  for (byte i = 0; i < aSize; i++)
    if (a1[i] != a2[i]) return false;
  return true;
}
// -----------------------------------------------------------------------------------------------------------
inline void copyArray(byte a1[], byte a2[], byte aSize)
{
  for (byte i = 0; i < aSize; i++)
    a1[i] = a2[i];
}
// -----------------------------------------------------------------------------------------------------------
inline void getArray(byte a[], byte len)
{
  for (byte i = 0; i < len; i++)
  {
    while (!Serial.available());
    a[i] = Serial.read();
  }
}
// -----------------------------------------------------------------------------------------------------------
inline MFRC522::MIFARE_Key RFID_GetKey()
{
  MFRC522::MIFARE_Key key;
  byte rawKey[6];
  for (byte i = 0; i < 6; i++)
  {
    while (!Serial.available());
    rawKey[i] = Serial.read();
  }

  for (byte i = 0; i < 6; i++)
    key.keyByte[i] = rawKey[i];
  return key;
}
// -----------------------------------------------------------------------------------------------------------
byte RFID_Auth(personalData data, MFRC522* rfid)
{
      if (!compareArray(data.uid, rfid->uid.uidByte, 4))
      {
        return 1;
      }

      MFRC522::StatusCode status;
      status = rfid->PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 1, &data.key, &(rfid->uid));
      if (status != MFRC522::STATUS_OK) 
      {
        return 2;
      }

      byte buff[18];
      byte len = 18;
      status = rfid->MIFARE_Read(1, buff, &len);
      if (status != MFRC522::STATUS_OK) 
      {
        return 3;
      }

      if (!compareArray(buff, data.passwd, 16))
      {
        return 4;
      }

      return 0;
}
// -----------------------------------------------------------------------------------------------------------
inline byte RFID_ChangePasswd(byte newPasswd[], MFRC522* rfid, MFRC522::MIFARE_Key key)
{
  return RFID_WriteBlock(newPasswd, rfid, key, 1);
}

bool isBlockPermitted(byte block)
{
#ifdef SECTORS_15
  if (block > 62) return false;
#endif

#ifdef SECTORS_14
  if (block > 58) return false;
#endif

  if (block < 8) return false;

  bool is = false;
  
  for (byte i = 0; i < 
#ifdef SECTORS_15
  42;
#endif
#ifdef SECTORS_14
  39;
#endif
  i++)
    if (block == permittedBlocks[i]) is = true;

  return is;
}
// -----------------------------------------------------------------------------------------------------------
byte RFID_WriteBlock(byte data[], MFRC522* rfid, MFRC522::MIFARE_Key key, byte block)
{
  MFRC522::StatusCode status;
  status = rfid->PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(rfid->uid));
  if (status != MFRC522::STATUS_OK) 
  {
    return 1;
  }

  byte data2[18];
  for (byte i = 0; i < 16; i++)
    data2[i] = data[i];
  
  status = rfid->MIFARE_Write(block, data2, 16);
  if (status != MFRC522::STATUS_OK) 
  {
    return 2;
  }

  return 0;
}
// -----------------------------------------------------------------------------------------------------------
byte RFID_ReadBlock(byte data[], MFRC522* rfid, MFRC522::MIFARE_Key key, byte block)
{
  MFRC522::StatusCode status;
  status = rfid->PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(rfid->uid));
  if (status != MFRC522::STATUS_OK) 
  {
    return 1;
  }

  byte buff[18];
  byte len = 18;
  
  status = rfid->MIFARE_Read(block, buff, &len);
  if (status != MFRC522::STATUS_OK) 
  {
    return 2;
  }

  copyArray(data, buff, 16);

  return 0;
}
// -----------------------------------------------------------------------------------------------------------
byte RFID_FormatCard(MFRC522* rfid, MFRC522::MIFARE_Key key)
{
  const byte data[18] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  
  for (byte i = 0; i < 
#ifdef SECTORS_15
  42;
#endif
#ifdef SECTORS_14
  39;
#endif
  i++)
  {
    byte block = permittedBlocks[i];

    MFRC522::StatusCode status;
    status = rfid->PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(rfid->uid));
    if (status != MFRC522::STATUS_OK) 
    {
      return 1;
    }

    status = rfid->MIFARE_Write(block, const_cast<byte*>(data), 16);
    if (status != MFRC522::STATUS_OK) 
    {
      return 2;
    }
  }

  return 0;
}
// -----------------------------------------------------------------------------------------------------------
inline personalData RFID_GetPersonalData()
{
  personalData data;
  
  Serial.println("KEY");
      
  data.key = RFID_GetKey();

  Serial.println("PASSWD");

  getArray(data.passwd, 16);

  Serial.println("UID");

  getArray(data.uid, 4);

  return data;
}

// -----------------------------------------------------------------------------------------------------------
inline bool RFID_WaitForCard(MFRC522* rfid, personalData personal)
{
  Serial.println("WAIT-CARD");
  
  while (!rfid->PICC_IsNewCardPresent()) { if (Serial.available()) {byte cmd = Serial.read(); if (cmd == 66) {Serial.println("CANCELED"); return true;}}}
  while (!rfid->PICC_ReadCardSerial());
  digitalWrite(13, LOW);
  Serial.println("CARD-PRESENT");

  byte ok = RFID_Auth(personal, rfid);
      
  if (ok == 1)      {Serial.println("ERR-UID");    return true;}
  else if (ok == 2) {Serial.println("ERR-KEY");    return true;}
  else if (ok == 3) {Serial.println("ERR-READ");   return true;}
  else if (ok == 4) {Serial.println("ERR-PASSWD"); return true;}

  return false;
}

最小可重现示例

Arduino:

代码语言:javascript
复制
void setup() 
{
  Serial.begin(9600);
}

void loop() 
{
  byte command;
  while (!Serial.available());
  command = Serial.read();
  // ...
  Serial.println("START");
  // Some operations
  byte someData;
  while (!Serial.available());
  someData = Serial.read();
  // Some operations
  Serial.println("OK");

  // Arduino receives, but not send
}

应用程序:

代码语言:javascript
复制
public static Status Authenticate(Key key, Passsword passwd, UID uid, string port)
        {
            SerialPort serial = new SerialPort(port, 9600, Parity.None, 8, StopBits.One);
            serial.Handshake = Handshake.None;

            serial.Open();

            byte[] cmd = { 1 };

            serial.Write(cmd, 0, 1); //Send command

            if (serial.ReadLine() != "START") //Device is ready. Here program is stuck, becuse it's waiting for START command that never comes
            { serial.Close(); return Status.Err; }

            serial.Write(cmd, 0, 1); //Send "someData"

            string stat = serial.ReadLine(); //Receive status

            serial.Close();

            switch (stat) //Check status
            {
                case "OK": return Status.OK;
                case "ERR-PASS": return Status.Inc_passwd;
                case "ERR-UID": return Status.Inc_uid;
                case "ERR-KEY": return Status.Inc_key;
                default: return Status.Err;
            }
EN

回答 1

Stack Overflow用户

发布于 2021-01-06 04:31:40

好的,成功了。我添加了

代码语言:javascript
复制
serial.DtrEnable = true;
serial.RtsEnable = true;

serial.Handshake = Handshake.None;之后

不管怎样,谢谢你的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65578309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档