微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与嵌入式c一起使用串行通讯时的新行

如何解决与嵌入式c一起使用串行通讯时的新行

我正在使用PICKIT学习用于微控制器的嵌入式c。当我通过串行通信将LDR的电压读数发送到RealTerm时,最终电压只是在线路上继续(参见图片),而不是在每次读数时都开始新的线路,我如何将其更改为以下形式?预先感谢。

0.9V
0.89V
0.9V

RealTerm data

#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",frac_part);

sprintf(LDR_arr,"%d.%02dV '\n'",frac_part);

我最终得到的电压沿对角线方向 RealTerm with '\n' inside

解决方法

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

  1. 将您的 terminal 配置为“仅LF”行的结尾,因此它将在每个LF之前隐式插入一个CR-所有终端仿真软件都支持这种配置,
  2. 在您的"\r\n"呼叫中明确输出CR + LF线路末端:sprintf()
  3. 修改底层串行I / O层,以在每个\r之前插入一个\n(“文本模式”)。

在我推荐的第一个中,因为在任何其他情况下,对于其他两个中的任何一个,您仍必须为CR + LF配置终端软件。默认情况下,任何特定的终端可能会配置什么,这简直是折腾,尽管很大程度上取决于它最初是为Windows还是POSIX开发的。

例如在TeraTerm中:

enter image description here

,

如果您查看ascii表0x0D是回车CR,则0x0A是换行符。 C的起源或它们共同发展的unix世界倾向于仅限于新行,在串行终端之前和之后默认为回车符(从新列开始)和新行(向下移动到换行)组合是上下移动的首选方式。 \ r为回车0x0D,\ n为换行0x0A。

虽然您可以更改一些哑终端,以将换行符转换成两种形式,但只需在程序中正确执行换行符就更加实用且可移植。因此,正如注释中指出的那样,在要打印的字符串的末尾添加\ r \ n(或在您选择的开头)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。