Có thể gửi các ký tự thông qua nối tiếp để đi lên một dòng trên cửa sổ giao diện điều khiển?


7

Tôi nghĩ có thể là do cách tôi có thể chạy vi trực tiếp từ cổng nối tiếp của mình khi nhìn qua TeraTerm. Ở đó, tôi có thể chỉnh sửa một số văn bản, đi đến dòng tiếp theo, sau đó quay lại và chỉnh sửa dòng đầu tiên! Làm thế nào để họ làm điều này?

Nhân vật nào trên UART tôi có thể gửi qua để "lên một dòng"?

EDIT: Rõ ràng thức ăn dòng hoạt động. "\ f" để xóa màn hình. Tuy nhiên, điều này chỉ hoạt động cho Hyperterminal trên máy của tôi chứ không phải Teraterm. Có ai biết tại sao không?

Câu trả lời:


11

Sử dụng mã thoát VT100 để điều khiển con trỏ.

Ví dụ.

puts("\033[2J");   // clear screen
puts("\033[0;0H"); // set cursor to 0,0
puts("\033[10B");  // move cursor down 10 lines
puts("\033[5A");  // move cursor up 5 lines

gọn gàng tôi sẽ phải thử điều này đôi khi, nhưng những người đó có lẽ nên được thông qua phải không? hoặc đặt thực sự nhận ra toàn bộ các chuỗi đó là mã thoát riêng lẻ? Tôi đã từng nghĩ về các mã thoát như một dấu gạch chéo ngược theo sau bởi một ký tự ...
Abbeyatcu

1
thực ra, đừng bận tâm, tôi thấy bạn đang sử dụng hương vị bát phân của mã thoát và ký tự thoát <ESC> ký tự (0x1B = 033 = 27) làm tiền tố
Abbeyatcu

Vì vậy, những gì vẽ lại màn hình, trong trường hợp này? Có phải vỏ chỉ làm tiếng vang thông minh?
tyblu

Một màn hình VT100 thực sự sẽ có bộ đệm khung được liên tục vẽ lại. Trên PC, trình giả lập thiết bị đầu cuối mô phỏng các thiết bị đầu cuối và làm điều tương tự
Toby Jaffey

Tôi khá chắc chắn góc trên bên trái của màn hình là 1; 1 chứ không phải 0; 0, nhưng các tham số bị bỏ qua hoặc các tham số được chỉ định là 0 sẽ được coi là 1 trước các lệnh A, B, C, D hoặc H.
supercat

3

Những gì bạn nhìn thấy trên cửa sổ giao diện điều khiển là kết quả của tiếng vang tự động (thường có thể tắt hoặc bật), trong đó chương trình giao diện điều khiển vẽ các ký tự bạn gửi trên màn hình hoặc kết quả nhận các ký tự. Điều này có nghĩa là có hai cách để thay đổi nó:

  1. Có một chương trình địa phương, trên PC, vẽ lại màn hình.
  2. Có thiết bị được kết nối vẽ lại màn hình.

Có nhiều cách để làm điều này, nhưng đây là cách tôi tiếp cận với việc thực hiện sở thích đơn giản:

  • Đặt độ rộng đường mặc định, như 80 và số hàng, như 24. Tắt tiếng vang tự động.
    văn bản thay thế
  • Màn hình 80x24 có nghĩa là 1920 ký tự trên mỗi 'khung hình' , có nghĩa là, nếu thiết bị được kết nối đang hoạt động, tốc độ làm mới tối đa khoảng 1920/BAUDRATE/11hoặc khoảng 5Hz tại 115200 baud (sử dụng 1 bit start, 1 stop, 1 parity, 8 dữ liệu) .
  • Ánh xạ các phím mũi tên đến các ký tự hoặc chuỗi cụ thể . Điều này có thể đã được thực hiện đằng sau hậu trường. (Đối với Terminal OSX, bên trái : \033[5D; phải : \033[5C; lên & xuống không xác định theo mặc định.)
  • Lập trình thiết bị được kết nối để nhận ra các ký tự và / hoặc chuỗi này và di chuyển tham chiếu con trỏ tương ứng.
  • Đầu ra trên dòng nối tiếp không phải bằng ký tự hoặc mảng ký tự, mà theo khung. Cụ thể, giữ hai mảng ký tự dài 1921 (1920 + terminator): một mảng để ghi trong khi cái kia đang được truyền (giả sử sử dụng UART phần cứng và ngắt).
  • Việc ghi vào bộ đệm khung có thể được thực hiện bằng cách sử dụng một hàm như thế này:
    uint8_t framewrite(const char *s, uint8_t row, uint8_t col)
    ... *sMảng char [chấm dứt] của bạn ở đâu rowcollà nơi bạn muốn ký tự đầu tiên xuất hiện. (Trả về uint8_tlà để bắt lỗi.)
  • Có thể bạn sẽ muốn chức năng thích uint8_t frame_clear(void), uint8_t frame_shiftrowsdown(void)vv
  • Để chỉ ra vị trí con trỏ, bạn có thể thay thế ký tự hiện tại và hộp đen hoặc ký tự bạn chọn ( pblinkchar), bằng cách sử dụng framewrite(pblinkchar,cursor_row,cursor_col).
  • Phương pháp tương tự có thể được sử dụng để lặp lại các ký tự trở lại vị trí con trỏ.

Tôi chắc chắn có nhiều cách đơn giản hơn (tôi nghĩ rằng những người làm phần mềm gọi nó là "thanh lịch") để làm điều này bằng cách lập trình một cửa sổ PC, và bạn có thể tìm ra cách bằng cách tìm hiểu hướng dẫn này , nhưng cách trên tương tự như tôi Đã thực hiện trong quá khứ và hoạt động cho các giao diện người dùng đơn giản với micros có nhiều bộ nhớ dự phòng.


1

Đây là một câu trả lời gián tiếp cho câu hỏi của bạn. Nếu bạn ở VI, thì tất cả những gì bạn cần làm để di chuyển con trỏ lên là gửi 'k'.

Nhìn vào trang lệnh VT100 này , có vẻ như phím mũi tên lên được thể hiện bằng cách gửi chuỗi sau: ESC [ Ahoặc 0x1B, 0x5B, 0x41. Tôi không biết nếu nó sẽ làm việc, nhưng tôi quan tâm để biết nếu nó làm.

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.