问题描述
我正在使用PICKIT学习用于微控制器的嵌入式c。当我通过串行通信将LDR的电压读数发送到RealTerm时,最终电压只是在线路上继续(参见图片),而不是在每次读数时都开始新的线路,我如何将其更改为以下形式?预先感谢。
0.9V
0.89V
0.9V
#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
解决方法
您可能需要做以下三件事之一:
- 将您的 terminal 配置为“仅LF”行的结尾,因此它将在每个LF之前隐式插入一个CR-所有终端仿真软件都支持这种配置,
- 在您的
"\r\n"
呼叫中明确输出CR + LF线路末端:sprintf()
。 - 修改底层串行I / O层,以在每个
\r
之前插入一个\n
(“文本模式”)。
在我推荐的第一个中,因为在任何其他情况下,对于其他两个中的任何一个,您仍必须为CR + LF配置终端软件。默认情况下,任何特定的终端可能会配置什么,这简直是折腾,尽管很大程度上取决于它最初是为Windows还是POSIX开发的。
例如在TeraTerm中:
,如果您查看ascii表0x0D是回车CR,则0x0A是换行符。 C的起源或它们共同发展的unix世界倾向于仅限于新行,在串行终端之前和之后默认为回车符(从新列开始)和新行(向下移动到换行)组合是上下移动的首选方式。 \ r为回车0x0D,\ n为换行0x0A。
虽然您可以更改一些哑终端,以将换行符转换成两种形式,但只需在程序中正确执行换行符就更加实用且可移植。因此,正如注释中指出的那样,在要打印的字符串的末尾添加\ r \ n(或在您选择的开头)。