2012-08-08 25 views
6

Tôi đang làm việc trên một dự án có ArduinoMega2560. Có rất nhiều cổng nối tiếp có sẵn, và tôi muốn có một biến để giữ một tham chiếu đến một trong số họ, một cái gì đó như thế này:Loại dữ liệu đối tượng nối tiếp Arduino, để tạo biến chứa tham chiếu đến cổng

SerialPort port; 
if (something == somethingElse) 
    port = Serial; 
else 
    port = Serial1; 

byte b = 5; 
port.write(b); 

Tuy nhiên, các tài liệu hướng dẫn Arduino là một trong hai hạn chế hoặc tôi đã không tìm thấy thông tin tôi đang tìm kiếm. Tôi nghĩ rằng những gì tôi cần nó "loại Serial, Serial1, vv là gì?".

Trả lời

9

Loại C++ cơ bản cho các đối tượng Nối tiếp là HardwareSerial. Bạn có thể thấy rằng trong các tập tin trong <arduino path>\hardware\arduino\cores\arduino. Sau đó bạn có thể sử dụng một con trỏ sử dụng mã như thế này:

HardwareSerial *port; 
if (something == somethingElse) 
    port = &Serial; 
else 
    port = &Serial1; 

byte b = 5; 
port->write(b); 
+0

Đó là những gì tôi cần. Cảm ơn nhiều. – Steve

+0

Nó có thể được thực hiện với tài liệu tham khảo? Vì vậy, các cuộc gọi phương thức là với. không -> –

+1

@ Osman-pasha: Có lẽ nhưng sẽ khó xử hơn khi xác định tham chiếu. Tại một đoán nó có thể là một cái gì đó như 'HardwareSerial & port = (something == somethingElse)? Serial: Serial1; byte b = 5; port.write (b); ' – tinman

0

Tôi không biết gì về Arduino, nhưng cách này thường được thực hiện trên hầu hết các vi điều khiển là bạn trỏ thẳng vào khu vực đăng ký của periheral, trong trường hợp này là cổng nối tiếp. Cho phép giả MCU của bạn ánh xạ những thanh ghi như thế này:

// serial port 1 
0x1234 SERIAL_CONTROL_REG 
0x1235 SERIAL_DATA_REG 
0x1236 SERIAL_STATUS_REG 

// serial port 2 
0x2000 SERIAL_CONTROL_REG 
0x2001 SERIAL_DATA_REG 
0x2002 SERIAL_STATUS_REG 

Sau đó bạn có thể theo dõi một cảng với một con trỏ, như thế này:

#define SERIAL_PORT1 ((volatile uint8_t*)0x1234) 
#define SERIAL_PORT2 ((volatile uint8_t*)0x2000) 

typedef volatile uint8_t* serial_port_t; 
... 

serial_port_t port; 

if (something == somethingElse) 
    port = SERIAL_PORT1; 
else 
    port = SERIAL_PORT2; 

này sau đó có thể được mở rộng hơn nữa để bạn có thể sử dụng các thanh ghi giống như các biến, ví dụ với các macro:

#define SERIAL_CONTROL_REG(offset) (*(offset + 0)) 
#define SERIAL_DATA_REG(offset) (*(offset + 1)) 
#define SERIAL_STATUS_REG(offset) (*(offset + 2)) 

if(SERIAL_STATUS_REG(port) & some_mask) 
{ 
    SERIAL_DATA_REG(port) = 0xAA; 
} 

Đây là cách bạn thường viết trình điều khiển phần cứng chung cho thiết bị ngoại vi MCU với nhiều hơn một cổng giống hệt on-board.

+0

Trong "Arduino Ngôn ngữ", mà tôi tin là chỉ là một tiền xử lý trước khi trao tắt để g ++, Serial là một con trỏ đến một đối tượng, không phải là một đăng ký. Ngôn ngữ của họ làm cho việc tạo mẫu nhanh chóng khá dễ dàng, nhưng như tôi đã nói ở trên, tài liệu để lại một chút để được mong muốn. – Steve

+1

@Steve Oh? Sau đó, tôi sẽ khuyên mọi người nên học lập trình nhúng thay vì lập trình Arduino. – Lundin

+1

Điều đó đúng trong nhiều trường hợp, nhưng khi thời gian không phải là một vấn đề, và thời gian phát triển cần phải được giữ ở mức tối thiểu, làm 'Serial.begin (9600); Serial.print ("Lệnh văn bản đơn giản"); 'dễ dàng hơn và nhanh hơn nhiều so với việc thiết lập thanh ghi và ngắt. Về cơ bản nó là một thư viện sẵn sàng, sẵn sàng để đi mà người khác viết. – Steve

Các vấn đề liên quan