实现功能:通过485通信,接收中断且得出收到数据的长度,阻塞式通信差不多搞定了(原理还不大清楚,自己把函数挨个试验了一遍,之前没用过HAL库函数写过程序,下面列出我的错误代码,请指正)下面两个代码是主函数主要看while(1)部分,和中断函数
[mw_shl_code=applescript,true]int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ //开始都是初始的配置 用cube产生的代码
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_UART7_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
HAL_UART_Receive_IT(&huart7,buf,5); //这里主要向片子发数据并让他返回 发送5个数据后 间隔打印一个乱码
while (1)
{
while(HAL_UART_GetState(&huart7)==RESET); //等待发送结束
HAL_GPIO_WritePin(GPIOE,DE_Pin, GPIO_PIN_SET); //拉高DI引脚
HAL_UART_Transmit(&huart7,UART7_RX_BUF,UART7_RX_STA,1000);
HAL_GPIO_WritePin(GPIOE,DE_Pin, GPIO_PIN_RESET);
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
void UART7_IRQHandler(void) //参考教材上的例程,为了读数据到数组,并记录长度
{
/* USER CODE BEGIN UART7_IRQn 0 */
/* USER CODE END UART7_IRQn 0 */
uint8_t Res;
if((__HAL_UART_GET_FLAG(&huart7,UART_FLAG_RXNE)!=RESET)) //如果接收中断
{
HAL_GPIO_WritePin(GPIOE,RE_Pin, GPIO_PIN_RESET); //拉低RO
HAL_UART_Receive(&huart7,&Res,1,1000);
HAL_GPIO_WritePin(GPIOE,RE_Pin, GPIO_PIN_SET);
if((UART7_RX_STA&0x8000)==0)//
{
if(UART7_RX_STA&0x4000)//
{
if(Res!=0x0a)UART7_RX_STA=0;//
else UART7_RX_STA|=0x8000; //
}
else
{
if(Res==0x0d) UART7_RX_STA|=0x4000;
else
{
UART7_RX_BUF[UART7_RX_STA&0X3FFF]=Res ;
UART7_RX_STA++;
if(UART7_RX_STA>(200-1))UART7_RX_STA=0;//
}
}
}
}[/mw_shl_code]
总结:因为刚接触F7,之前经验也很不足,对HAL库函数和中断的函数的理解不到位 再次请帮我指点指点 迷途在这3,4天了,也知道原理很重要,正加油补!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
好吧,才开始问题都不知道怎么问,一开始看手册来着,扁了半天也迷茫,后来把函数百度一下就找到方向了,目前遇到的问题是 用来计数 收到的数据个数清零了,但是再发给他数据他直接放到先前的数据后面
一周热门 更多>