Làm thế nào để dòng mã này phát hiện nếu một giao diện nối tiếp được kết nối?


7

Tôi đang làm việc với một số mã cho các nút cảm biến nhiệt độ từ xa. Chúng bật và tắt giao diện gỡ lỗi tùy thuộc vào việc có bất cứ thứ gì được kết nối với cổng nối tiếp hay không.

Mã này trên Github ở đây . Dòng 111 là dòng quan tâm:

if (Serial) debug = 1; else debug=0; //if serial UART to USB is connected show debug O/P.

Vì vậy, một câu hỏi đơn giản: Ở cấp độ phần cứng và phần mềm, làm thế nào để nó hoạt động? Tôi không thể thấy bất cứ điều gì trong Phần cứng hoặc Luồng sẽ trả về đúng / sai nếu có bất cứ điều gì được kết nối hay không.

Lưu ý rằng tôi không tự tin rằng nó thực sự hoạt động. Thử nghiệm đơn giản này cho thấy nó không hoạt động khi đèn LED nhấp nháy bất kể sự có mặt của bộ chuyển đổi nối tiếp hoặc kết nối:

boolean debug;

const int toggle = 6;

void setup()
{
  if (Serial) debug = 1; else debug = 0;

  pinMode(toggle, OUTPUT);
  digitalWrite(toggle, LOW);

  if (debug)
  {
    Serial.begin(9600);
    Serial.println("Setup");
    digitalWrite(toggle, HIGH);
    delay(1000);
    digitalWrite(toggle, LOW);
  }
}

void loop()
{
  if (debug)
  {
    Serial.println("Loop");
    digitalWrite(toggle, HIGH);
    delay(1000);
    digitalWrite(toggle, LOW);
    delay(1000);
  }
}

2
Sidenote: Đối với RS232 truyền thống, cách duy nhất để thực sự xác định xem có thứ gì đó được kết nối hay không là gửi dữ liệu và xem bạn có nhận được phản hồi không. Không có cơ chế phát hiện kết nối phổ quát khác. Đây là lý do tại sao các thiết bị nối tiếp trên windows đôi khi vẫn bị phát hiện dưới dạng chuột. HĐH giả định một tập hợp các ký tự nhất định có nghĩa là có một con chuột, vì nó không có cách nào khác để chứng thực giả định này, nó chỉ chạy với nó.
Sói Connor

Câu trả lời:


12

Bạn đúng - nó không hoạt động trong hầu hết các trường hợp và hầu như sẽ luôn trở lại đúng. Bảng mà nó thực sự hoạt động là Leonardo. Theo tài liệu chính thức :

Trên Leonardo, nếu (Nối tiếp) biểu thị thời tiết hoặc kết nối nối tiếp USB CDC đang mở. Đối với tất cả các trường hợp khác, bao gồm nếu (Nối tiếp 1) trên Leonardo, điều này sẽ luôn trả về đúng.

Các kết nối nối tiếp cơ bản (được sử dụng bởi hầu hết các Arduinos) thường không quan tâm nếu có bất cứ điều gì thực sự lắng nghe. Không có gì lạ khi các thiết bị nhúng gửi thông tin gỡ lỗi theo nối tiếp ngay cả khi không có gì nhận được. Điều này có lợi thế là thời gian và hành vi của mã sẽ không thay đổi khi gỡ lỗi, điều này có thể gây ra tất cả các loại vấn đề nếu bạn đang cố gắng chẩn đoán sự cố được báo cáo trong trường.


4

Mặc dù có thể không phát hiện được liệu thiết bị có được kết nối với kết nối nối tiếp Arduino hay không, nhưng có thể kích hoạt các thông báo gỡ lỗi qua kết nối nối tiếp dựa trên sự hiện diện của thiết bị trên kết nối nối tiếp.

Xem xét rằng bạn sẽ chỉ sử dụng giao diện gỡ lỗi của bản phác thảo khi được kết nối với máy tính có khả năng giao tiếp nối tiếp, có thể kết hợp một thử nghiệm đơn giản vào bản phác thảo dựa trên chế độ gỡ lỗi nào được bật hay không.

Khi bản phác thảo bắt đầu, bạn có thể kiểm tra xem có dữ liệu nào khả dụng trên kết nối Nối tiếp hay không. Nếu có, thì một thiết bị có mặt và gỡ lỗi có thể được kích hoạt. Về phía máy tính, bất cứ khi nào bạn muốn bắt đầu chế độ gỡ lỗi trên Arduino, chỉ cần gửi một byte qua kết nối nối tiếp trong setupgiai đoạn và ngồi lại.

Đây là một bản phác thảo mẫu cho thấy tương tự:

int debug = 0;

void setup()
{
  pinMode(13, OUTPUT);
  Serial.begin(9600);

  //Wait for four seconds or till data is available on serial, 
  //whichever occurs first.
  while(Serial.available()==0 && millis()<4000);

  //On timeout or availability of data, we come here.
  if(Serial.available()>0)
  {
    //If data is available, we enter here.
    int test = Serial.read(); //We then clear the input buffer

    Serial.println("DEBUG"); //Give feedback indicating mode

    debug = 1; //Enable debug
  }
}

void loop()
{
  if(debug==1) Serial.println("ON");
  digitalWrite(13,HIGH);
  delay(1000);
  if(debug==0) Serial.println("OFF");
  //Turn off if serial is not available
  digitalWrite(13,LOW);
  delay(1000); 
}

Đây là khá nhiều kỹ thuật tôi sử dụng trên mã của riêng tôi.
Cyberg Ribbon

Imho, bạn cũng có thể kích hoạt đầu ra nối tiếp ngay khi nhận được một ký tự. Hoặc sử dụng các chế độ xây dựng khác nhau (trong IDE nâng cao) hoặc thậm chí có thể kiểm tra xem điện áp đầu vào có từ USB không.
Paul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.