学习原子的视频到adc时手边没有LCD,没法直观地验证adc的结果是否正确,就想着用串口发到电脑上用XCOM看,结果调了一天都是乱码。某宝技术客服的一句“你可以试一下printf”还有不知名热心网友的“printf值得你一试”帮助我成功用串口在电脑上显示出电压值。
先看结果,再说问题
串口和adc的初始化都和原子的源码一样,就不粘了。
在while(1)里面写这个,调好波特率,打开XCOM就能看见PA1测到的电压值了。
u16 adcx;
float temp;
adcx=Get_Adc_Average(ADC_Channel_1,10);
temp=(float)adcx*(3.3/4096);
printf("\r\n%f\r\n",temp);
printf("\r\n%d\r\n",adcx);
delay_ms(100);
这个图的代码和上面的代码不一样。
注意测量的电压一定要和开发板共地!!!否则无法测量
问题:32返回ADC转换结果的函数是ADC_GetConversionValue(ADC1)这个函数返回u16即短整型的数据两个字节,然后USART_SendData()这个函数发送u8也就是字符型的数据一个字节,其实串口是一位一位的发,八位八位的存放,那如果要用串口USART_SendData这个函数向电脑发送ADC的数据
是不是必须得把整形的变成字符型的然后再放到数组里按位发送?有人告诉我说你可以高八位一发再低八位一发,收的时候再合起来,就这个问题而言,上位机(XCOM)是按照八位八位解析的,难道我要写个上位机?这不行。但是抛开问题而言这种方法可以用在下位机之间的通信。
我找了段把(int)0-9变(char)0-9的程序
#include<stdio.h>
int main(void)
{
int number=9;
char charValue=number+'0';
printf("The value is :%c",charValue);
return 0;
}
所以如果你要发送的是纯数据而且量不大的话而且你觉得可以的话,可以用这个把每一个数字拆出来做转换再赋值给char型的数组然后一个一个发。
最后说原子在串口实验中用的printf重定向
printf能在XCOM里显示出内容应该是和这段代码有关系(我不懂这个),在usart.c里面
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
小白一枚,欢迎大佬指正。