初级会员

- 积分
- 107
- 金钱
- 107
- 注册时间
- 2014-3-24
- 在线时间
- 19 小时
|

楼主 |
发表于 2017-9-15 17:44:15
|
显示全部楼层
顺便再贴一段读串口数据的代码:(以后自己要用了,就过来复制 )
typedef struct
{
uint8_t MaxLength;
uint8_t Length;
uint8_t Data[BUF_ARRAY_LEN]; //接收数据缓存区
}BUF_TypeDef;
typedef struct
{
uint8_t Total;
uint8_t Current; /* write */
uint8_t Readidx; /* read */
BUF_TypeDef Buffer[BUF_ROW_NUM];
}RECVBUF_TypeDef; //接收数据缓存区
//ch = USART_ReceiveData(UART4); //数据有了,放到目的地
①:从串口读到数据后
/*将串口读取到的数据转到接收缓冲数组*/
uint8_t RecvBufPushChar(RECVBUF_TypeDef *RevBuf, uint8_t ch)
{
uint8_t BufIdx = RevBuf->Current; //获取当前数组(第几行数组)
uint8_t BufLen = RevBuf->Buffer[BufIdx].Length; //获取当前数组长度
if(RevBuf->Total >= BUF_ROW_NUM) //判断接收缓冲区是否为满
{
return 0;
}
RevBuf->Buffer[BufIdx].Data[BufLen++] = ch; //将字符放入当前数组中
RevBuf->Buffer[BufIdx].Length = BufLen % BUF_ARRAY_LEN; //数组长度+1
return 1;
}
②:串口接收完最后一个字节后
/*将串口读取的最后一个字符转到接收缓冲区数组,并指向下一个数组*/
uint8_t RecvBufPushEndChar(RECVBUF_TypeDef *RevBuf/*, uint8_t ch*/)
{
// RecvBufPushChar(RevBuf,ch);
RevBuf->Current++;
RevBuf->Current=RevBuf->Current%BUF_ROW_NUM;
RevBuf->Total++;
if(RevBuf->Total>=BUF_ROW_NUM) //优化多次写数组超出设定值得BUG
{
RevBuf->Total=BUF_ROW_NUM;
}
return 1;
}
③:数据转存到数组
/*读接收缓冲区的数据*/
uint8_t RecvBufGetData(RECVBUF_TypeDef *RevBuf, uint8_t *DataBuf, uint8_t Length)
{
uint8_t DataLen=RevBuf->Buffer[RevBuf->Readidx].Length;
uint8_t StrLen=Length>DataLen?DataLen ength;
RecvBufCopy(DataBuf,RevBuf->Buffer[RevBuf->Readidx].Data,StrLen);
RecvBufReset(RevBuf,RevBuf->Readidx); //清除当前数组内容
RevBuf->Readidx ++; //指向下一组
RevBuf->Readidx = RevBuf->Readidx % BUF_ROW_NUM;
RevBuf->Total --; //标识数组容量增1
if(RevBuf->Total>BUF_ROW_NUM) //优化多次读数组超出设定值得BUG
RevBuf->Total=0;
return StrLen;
}
|
|