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.
Đó là những gì tôi cần. Cảm ơn nhiều. – Steve
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 -> –
@ 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