使用嵌入式c进行串行通信时的新线

使用嵌入式c进行串行通信时的新线,c,embedded,microcontroller,pic,C,Embedded,Microcontroller,Pic,我正在学习使用PICKIT为微控制器设计的嵌入式c。当我通过串行通信将LDR的电压读数发送到RealTerm时,电压只是继续在线路上运行(参见图),而不是每次读取都启动一条新线路,我如何将其更改为这样?提前谢谢 0.9V 0.89V 0.9V 或 最后得到的是沿对角线方向的电压 您需要做以下三件事之一: 将您的终端配置为“仅限LF”行结束,因此它会在每个LF之前隐式插入CR-所有终端仿真软件都支持这种配置 在sprintf()调用中显式输出CR+LF行结束:“\r\n” 修改低级串行I/O层

我正在学习使用PICKIT为微控制器设计的嵌入式c。当我通过串行通信将LDR的电压读数发送到RealTerm时,电压只是继续在线路上运行(参见图),而不是每次读取都启动一条新线路,我如何将其更改为这样?提前谢谢

0.9V
0.89V
0.9V

最后得到的是沿对角线方向的电压

您需要做以下三件事之一:

  • 将您的终端配置为“仅限LF”行结束,因此它会在每个LF之前隐式插入CR-所有终端仿真软件都支持这种配置
  • sprintf()
    调用中显式输出CR+LF行结束:
    “\r\n”
  • 修改低级串行I/O层,在每个
    \n
    之前插入
    \r
    (“文本模式”)
  • 其中我推荐第一个,因为对于其他两个,您仍然必须在任何情况下为CR+LF配置终端软件。默认情况下,任何特定的终端都可能配置为什么,这是一个掷硬币决定的问题——尽管这在很大程度上取决于它最初是为Windows还是POSIX开发的

    例如,在RM中:


    如果查看ascii表,0x0D是回车符CR,0x0A是换行符。在unix世界中,C源于或它们一起开发的地方往往仅限于新行,在串行终端之前、期间和之后,默认为回车(从新列开始)和新行(下移到新行)这两个单独的字符。组合是下移和左移的首选方式\r是回车0x0D,\n是换行符0x0A


    虽然您可以更改一些哑终端以将换行符同时转换为这两种格式,但在程序中正确地执行这一操作更为有用和可移植。因此,正如注释中所指出的,将\r\n添加到要打印的字符串的末尾(或开头,由您选择)。

    '\n'
    添加到
    sprintf
    。。。可能您还需要一个显式的
    '\r'
    ,具体取决于您的终端。您需要执行
    sprintf(LDR\u arr,“%d.%02dV\r\n”,int\u部分,frac\u部分)
    或将teraterm配置为使用NL而不是CRNL正确显示换行符谢谢@Eugene,“'\r'`让它工作了,“'\n'和''\r'到底做了什么?我以前从未使用过它们。我认为“'\n'”只会创建一个新行,但它似乎不是这样工作的,我以前也没有听说过“'\r'”。新行通常由一个“换行符”字符(LF)-将“插入符号”移动到下一行的字符和“回车符”(CR)-将插入符号移动到行的开头的字符组成<代码>\n可能被解释为与两者相同或仅与LF相同<代码>\r是CR。非常感谢您对[@Eugene]的解释,我对c编程非常陌生,这是我第一次尝试串行通信,因此我非常感谢您的帮助
    #pragma config FEXTOSC = HS     // External Oscillator mode Selection bits (HS (crystal oscillator)above 8 MHz; PFM set to high power)
    
    #pragma config RSTOSC = EXTOSC_4PLL// Power-up default value for COSC bits (EXTOSC with 4x PLL, with EXTOSC operating per FEXTOSC bits)
    
    
    // CONFIG3L
    
    #pragma config WDTE = OFF        // WDT operating mode (WDT enabled regardless of sleep)
    #include <xc.h>
    #include <stdio.h>
    #include "LCD.h"`
    #include "serial.h"
    #include ADC.h
    
    define _XTAL_FREQ 64000000 //note intrinsic _delay function is 62.5ns at 64,000,000Hz  
    
    void main(void) {
    LCD_Init(); 
    initUSART4();   //Initialise EUSART4
    ADC_init();
    
    char LDR_arr[16];
    unsigned int x;
    unsigned int int_part; //initialise int part of voltage
    unsigned int frac_part; // initialise fraction part of voltage
    
    //char buf = getCharSerial4();
       //Clear Screen
    LCD_sendbyte(0b00000001, 0); 
    while (1)
    {
        x = ADC_getval();
        //ADC2String(LDR_arr, x);
        
        
        /* max voltage = 3.3V, max LDR value = 255
         * 255/3.3 = 77.3 so use 77 for division
         * int_part = LDR value/77
         * frac_part = (LDRvalue * 100)/77 - int_part*100, giving first 2 DP as integer
         */
        int_part = x/77;
        frac_part = (x*100)/77 - int_part * 100;
    
        // and format as a string using sprintf (see GitHub readme)
        // %02d ensures that 2 numbers are always displayed frac_part
        // e.g. frac_part = 5, get 0.05 after decimal instead of 0.5 
        // which would get if used %01d or 0.005 if used %03d
        sprintf(LDR_arr,"%d.%02dV",int_part,frac_part);
    
        sendStringSerial4(LDR_arr); // send voltage to RealTerm
        
        __delay_ms(1000);
        LCD_sendbyte(0b00000001, 0); //clear screen
        __delay_ms(1.53);
        
      
        
        }
    }
        
    
    void sendCharSerial4(char charToSend) {
        while (!PIR4bits.TX4IF); // wait for flag to be set
        TX4REG = charToSend; //transfer char to transmitter
    
    
    void sendStringSerial4(char *string){
        while(*string!=0){
            sendCharSerial4(*string++);
        }
    
    sprintf(LDR_arr,"%d.%02dV \n",int_part,frac_part);
    
    sprintf(LDR_arr,"%d.%02dV '\n'",int_part,frac_part);