20190515 23:25
1、串口通讯
战舰stm32板载两个串口,一个是USB串口,一个RS232串口,实现功能:stm32利用USB串口和上位机通讯。stm32可以发送数据给上位机串口调试助手显示,通过串口调试助手发送数据给stm32,stm32将接收的数据再发送给上位机调试助手显示。
硬件资源:串口1. 由于串口1和usb串口在硬件上并没有连接。因此需要用跳线帽将P6的RXD和TXD与PA9 PA10连接起来,至此硬件连接完成。为什么通过USB转TTL 不可以。(是不是选错端口了)
USB串口、RS232\RS485\TTL的区别是什么。
单片机串口的输入、输出是TTL电平。即+5V代表逻辑1,0V代表逻辑0,因此可以接不同的芯片比如RS232\RS485完成不同的通信。
COM口即串行通讯端口,简称串口。串口(COM口)指的是物理接口形式。RS232/RS485/TTL指的是串口的电平标准。
2、C语言字符串
字符串长度计算库函数原型为 size_t strlen(char const *string),函数返回的类型是一个size_t类型,该类型是一个无符号整型类型。因此会有如下截图中的陷阱:
3、结构的声明
引入标签的概念,允许多个声明引用同一个成员列表,并且这些结构声明是同一种类型的结构。
引入typedef,就可以使用类型名。它所引入的是个类型名,而不结构标签。
4、指针的运用不当。
声明了一个简单的结构体,typedef struct
{
char * base; //
unsigned int front;
unsigned int rear;
}SqQueue;
在主函数中给结构体中的元素初始化,程序只要跳到赋值这这步,就进入HardFault。原因是在主函数中定义了一个结构体指针变量。SqQueue *q;但是并没有给指针进行初始化,指针成为野指针,造成了程序总是进入HardFault。
5、指针数组的定义
定义指针数组有问题:按照const char key_word[]={"hello","for","world"};显示定义错误。将其放在MDK中显示指针类型的数据不能被用来去初始化一个字符类型的数据。应该按照const *char key_word[]={"hello","for","world"};定义。(const char key_word[]={'s','a','k'}; 这样定义是可以的。)
char const *key_word[] = {"register","do","for","fdfdsalfjdsf","zhang"}; sizeof(key_word)=20; // 整个数组占用的字节数。sizeof(key_word[0])=4; //代表数组每个元素占用的字节数。指针数组中存储的是指针,数组名是数组第一个元素的地址,即指针的指针。因此可以定义一个指针的指针变量进行指针之间的额赋值。即char const**key; key = key_word;
在大多数情况下,数组名代表的是数组第一个元素的指针。但是有两种情况例外,sizeof返回的是整个数组所占用的字节而不是一个指针所占用的字节。例如sizeof(key_word)= 20;另外单目运算符& 返回的是指向数组的指针而不是一个指向数组第一个元素的指针的指针。
函数接收到的参数是实际参数的一份拷贝,因此对形参进行操作不会该改变实际参数的值,但是对指针参数进行间接访问可以修改原来元素的值,因此如果有可能,函数的指针形参都应该声明为const。
如何声明一个指向数组的指针
int (*p)[10];下标引用的优先级高于间接访问。但是由于括号的存在。因此p先是一个指针,然后再说明p是一个指向10个Int类型数组元素的指针。
6、一个函数可以以如下这种方式进行定义和传输变量,
void UI_SETTXT(unsigned short ID, const unsigned short wText[],int iNum)
{
int i;
User_Uart1SendChar(0x5A);
User_Uart1SendChar(0xA5); //
User_Uart1SendChar(iNum + 3);//
User_Uart1SendChar(0x82);//
User_Uart1SendChar(ID >> 8);
User_Uart1SendChar(ID); //
for(i =0 ; i < iNum / 2; i++)
{
if(wText[i]>255)
{
User_Uart1SendChar(wText[i] >> 8);
User_Uart1SendChar(wText[i]);
}
else User_Uart1SendChar(wText[i]);
}
}
变量定义如下:
const unsigned short PLS_INSERT_HAND[] = { \
'C', //
'o',//
'n',//
'n',//
'e',//
'c',//
't',//
0xA340,//
'H',
'a',
'n',
'd',
'p',
'i',
'e',
'c',
'e',
0xA340,// ' ',
0xA340,//
0xA340,// ' ',
0xA340,//
0xA340,// ' ',
0xA340,//
0,
0,
};
调用如下:
UI_SETTXT(SYSTEM_MSG_TXT,PLS_INSERT_HAND,sizeof(PLS_INSERT_HAND));
乍一看以为传进函数的参数是一个数组,实际上是指针,并且这个指针还是const类型的,相当于传进去的是一个const *p的变量,这个指针指向的内容是常量。这个自己不经常使用这种方式,因此感觉很别扭生疏,以后再遇到这种情况就不需要纠结了。