使用嵌入式c进行串行通信时的新线
我正在学习使用PICKIT为微控制器设计的嵌入式c。当我通过串行通信将LDR的电压读数发送到RealTerm时,电压只是继续在线路上运行(参见图),而不是每次读取都启动一条新线路,我如何将其更改为这样?提前谢谢使用嵌入式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层
0.9V
0.89V
0.9V
或
最后得到的是沿对角线方向的电压
您需要做以下三件事之一:
sprintf()
调用中显式输出CR+LF行结束:“\r\n”
\n
之前插入\r
(“文本模式”)如果查看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);