【问题标题】:AVR C : Serial Communication Clear ScreenAVR C:串行通信清除屏幕
【发布时间】:2017-03-07 03:55:49
【问题描述】:

我正在使用带有 Atmega 微控制器的 AVR C。我正在使用串行通信,我想将一个字符“A”传输到屏幕,然后将其擦除并显示“B”。我在清除屏幕时遇到麻烦。

我读到 ESC ASCII 可以工作,所以我尝试了。

#define F_CPU 16000000UL


void initUART(unsigned int baud);
void transmitByte(unsigned char data);
unsigned char receiveByte(void);

int getNumOfDigits(int num);
void printDec(int num);

int main(void) {


    DDRB = 0b00000011; 
    PORTB = 0b00011000;

    initUART(9600);


    while(1) {

        //s1 pressed
        if ((PINB & 0b00001000) == 0) {

            transmitByte('A');
            transmitByte((char) 27);
            transmitByte('B');
            _delay_ms(1000);
        }  

    }

    return 0;
}

void initUART(unsigned int baud) {

    /*
        Initialize settings for uart functions.
        Must be done once at the beginning of the program.
    */

    //Normal mode UBRR formula
    unsigned int ubrr = F_CPU/16/baud-1;

    //shift MSB and store in UBRR0H
    UBRR0H = (unsigned char) (ubrr >> 8);

    //store LSB in UBRR0L
    UBRR0L = (unsigned char) ubrr;

    //Enable transmitter/receiver
    UCSR0B = (1 << RXEN0) | (1 << TXEN0);

    //8-Bit Characters, 0 Stop bits, No parity
    UCSR0C = (1 << UCSZ00) | (1 << UCSZ01); 

}

void transmitByte(unsigned char data) {

    /*
        Write byte to UART
    */

    //Wait for empty transmit buffer
    while(!(UCSR0A & (1 << UDRE0)));

    //Start transmission by writing to UDR0
    UDR0 = data;

}

unsigned char receiveByte(void){

    /*
        Read byte from UART
    */

    //Wait for incoming byte
    while(!(UCSR0A & (1 << RXC0)));

    //Return the byte
    return UDR0;
}

但它不起作用,我对微控制器相当陌生,它只是打印

AAAA..

如何清屏,然后在串口通讯屏上打印一个新字符,我用的是putty。

更新

transmitByte('A');



transmitByte(27);   // this is the escape
transmitByte('[');
transmitByte('2');
transmitByte('J');  // uppercase J

transmitByte('^');
transmitByte('[');
transmitByte('H');  

transmitByte('B');

输出

如何让光标回到原来的位置?

最后的工作

transmitByte('A');

transmitByte(27);   // this is the escape
transmitByte('[');
transmitByte('2');
transmitByte('J');  // uppercase J

transmitByte(27); 
transmitByte('[');
transmitByte('H');  

transmitByte('B');

以上代码有效,擦除并将光标移回。

【问题讨论】:

  • 转义字符只是引入了一个执行一些特殊命令的字符串,在这个cae“BAB”中什么都不做。更好的选择可能是退格、回车或换页。 8、13 或 12。试试它们,看看会发生什么

标签: c putty avr


【解决方案1】:

我不太确定你想发送一个“A”然后清屏,但是...如果你想清屏你必须发送 转义序列你的终端模拟器可以理解.通常,ESC[2J 会这样做,并且许多终端仿真器都可以理解。所以你可以写:

transmitByte(27);   // this is the escape
transmitByte('[');
transmitByte('2');
transmitByte('J');  // uppercase J

看看腻子的“终端仿真”特性(它有几个选项),一般来说,就是“转义序列”。还要考虑^[[2J(^[ 表示Escape)清除屏幕,但不应将光标发送到主页。为此,您需要^[[H

一些基本信息的链接:http://www.isthe.com/chongo/tech/comp/ansi_escapes.html

还有:http://ascii-table.com/ansi-escape-sequences.php

也就是说,打印退格键以返回行中的一个位置(十进制字符 8)或回车返回当前行的开头(十进制字符 13)也可能很有趣,并且最后打印一些东西,然后用ESC[K 清除该行的其余部分。

【讨论】:

  • 澄清一下,我想在腻子屏幕上打印“A”,然后将其擦除以打印“B”。
  • 擦除字符“A”并打印“B”工作正常,但是,现在光标问题,它向前移动,这是我不想要的。我试过 ^[H 但它似乎没有解决它。
  • @SaadA 对不起“清除屏幕”,在我看来你想要那个。关于光标问题,我不明白。光标在打印后总是移动,但退格应该让它返回。如果您发送A BS B BS,您应该会看到一个带有光标下方的“B”。你能解释得更好吗?
猜你喜欢
  • 1970-01-01
  • 2015-11-08
  • 2015-07-15
  • 2013-06-24
  • 2020-07-01
  • 1970-01-01
  • 2016-01-15
  • 2018-12-20
  • 2012-04-23
相关资源
最近更新 更多