qq_32818873 2020-08-05 11:14 采纳率: 25%
浏览 271
已采纳

求问,485通信串口助手只能接受到stm32发送的第一节数据,怎么办?

程序如下:
void bsp_RS485_IRQHandler(void)//串口中断部分
{
//判断有无溢出
if(USART_GetITStatus(RS485_usart, USART_IT_ORE)==SET)
{

USART_ClearITPendingBit(RS485_usart, USART_IT_ORE);
USART_ReceiveData(RS485_usart);

}
if(USART_GetITStatus(RS485_usart, USART_IT_RXNE) != RESET)
{
uart_buff[uart_p] = USART_ReceiveData(RS485_usart);
uart_p++;

USART_ClearITPendingBit(RS485_usart, USART_IT_RXNE);
}
if(uart_p == 9)
{
recivestate = 1;//接收到完整的数据时,将接受分析标志位置一
len = uart_p;
for(i = 0;i<uart_p;i++)//´«³öÊý¾Ý
{
uart_rx_buff[i] = uart_buff[i];//转移数据
}
//clean_rebuff();
}

void main()

RS485_init();

u16 sum=0;
void test()
{
u8 txbuff[1024];
u8 buff[2] = {0x01,0x02};
u16 i,cnt = 0;

if(recivestate == 1)
{
recivestate = 0;
for(i=1;i {
sum += uart_rx_buff[i];
}
if(uart_rx_buff[cnt] == title1_send && uart_rx_buff[cnt+1] == title2_send)
{
if(uart_rx_buff[cnt+5] == (sum&0xff) && uart_rx_buff[cnt+6] == ((sum>>8)&0xff))

{

  switch(uart_rx_buff[cnt+2])
 {
 case 0x08: //选择功能
  RS485_TX_EN();//切换到发送

  RESEND(0x08,len);

 //RS485_delay(10000);
   RS485_RX_EN();
   break;
 }


void RESEND(u8 cmd,u8 L)//发送内容
{
u8 data_send[50];
u8 cnt = 0;
u16 i ,sum;

data_send[cnt++] = title1_send;
data_send[cnt++] = title2_send;
data_send[cnt++] = cmd;
data_send[cnt++] = L;

for(i=1;i {
sum += data_send[i];
}
data_send[cnt++] = (sum&0xff);
data_send[cnt++] = ((sum>>8)&0xff);
data_send[cnt++] = 0X0D;
data_send[cnt++] = 0X0A;

USART_send_array(RS485_usart,data_send,cnt-1);
}

//发送数组
void USART_send_array(USART_TypeDef *pUSARTx,u8 *array,u8 len)
{
u8 i=0;
while(i<len)
{
USART_SendData(pUSARTx,array[i]);

while( USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)!= SET);
i++;
}
}

配置文件

void RS485_configure()
{
GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;
//配置时钟
RCC_APB2PeriphClockCmd(RS485_usart_clk,ENABLE);
RCC_APB2PeriphClockCmd(RS485_USART_RX_GPIO_CLK,ENABLE);
RCC_APB2PeriphClockCmd(RS485_USART_TX_GPIO_CLK,ENABLE);
RCC_APB2PeriphClockCmd(RS485_USART_PE_GPIO_CLK,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//配置引脚
GPIO_InitStructure.GPIO_Pin=RS485_usart_TX_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(RS485_USART_TX_GPIO_PORT,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=RS485_usart_RX_pin; 
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;     
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(RS485_USART_RX_GPIO_PORT,&GPIO_InitStructure);  

GPIO_InitStructure.GPIO_Pin=RS485_RE_PIN; 
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;     
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(RS485_RE_GPIO_PORT,&GPIO_InitStructure);
//配置中断优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = RS485_INT_IRQ;      
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          
NVIC_Init(&NVIC_InitStructure);

//使能中断
USART_ITConfig(RS485_usart, USART_IT_RXNE, ENABLE);
USART_ITConfig(RS485_usart, USART_IT_IDLE, ENABLE);
USART_ITConfig(RS485_usart, USART_IT_ORE, ENABLE);
//设置为接收状态
GPIO_ResetBits(RS485_RE_GPIO_PORT,RS485_RE_PIN);
}

中断里接收到的数据是完整的,比如接收到了3A 16 08 01 00 .... 0D 0A,我想mcu返回3A 16 09 02.....,全速运行后结果只返回了一个3A,然后程序卡住了,之后再怎么发都不返回了,停下来就发现一直在中断里面。我查了下数据,数据也有传到uart_rx_buff[]里面了。求各位大神帮帮忙!!!!!!(还有一点,我按照网上的说法在发送后面加了个延时函数,就发送了3A 16,之后无论怎么加大延时函数也是发这两个。)

  • 写回答

2条回答 默认 最新

  • thisislaibao 2020-08-05 20:40
    关注

    你的问题描述很模糊。

    看你里面是9个字节长,那么“只接受第一节数据”是什么意思?
    只有第一字节有数据,后面都是空?还是只发送了一次?
    是发送函数问题?还是接收函数有问题?还是2个都有问题?

    你说“接收很完整”,意思是能确定问题在发送上?

    这样没头绪的搞来搞去,你不觉得是在浪费时间吗?你怎么不给设备接个显示器呢?1602会操作吧?显示一下接收的数据不行吗?
    要是接不了1602,printf总会用吧!这不是经典的调试方法吗?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误