一个用了两年单片机的人遇到的openmv和stm32 串口通讯的问题,不是那么容易解决,求大神
-
void USART2_IRQHandler(void)
{static uint8_t rebuf[8]={0},i=0; if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) { rebuf[i++]=USART_ReceiveData(USART2); if(rebuf[0]!=0xb3)//ÅжÏÖ¡Í· i=0; if((i==2)&&(rebuf[1]!=0xb3))//ÅжÏÖ¡Í· i=0; if(i>=7)//µ±i¼ÆÊýÖµ=8ʱ£¬¹¦ÄÜ×Ö½Ú½ÓÊÜÍê±Ï£¬Êý¾Ý³¤¶È×Ö½Ú½ÓÊÕÍê±Ï { memcpy(OpenMV_Rx_BUF,rebuf,i); i = 0; } USART_ClearFlag(USART2,USART_FLAG_RXNE);//ÇåÖжϱêÖ¾ }
}
void USART2_Configuration(uint32_t uBaud)
{USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* config USART2 clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); USART_DeInit(USART2); /* USART2 GPIO config */ /* Configure USART2 Tx (PA2) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART2 Rx (PA3) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//?????3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);/* USART2 mode config */ USART_InitStructure.USART_BaudRate = uBaud; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); USART_Cmd(USART2, ENABLE);
}
刚才看了下程序排版乱码,重新发下
-
补充一点,经过在线调试发现,是无法正确进入串口中断函数
-
我只能解决OpenMV上的问题,不能解决你的STM32上的问题。
-
也许你应该用逻辑分析仪,看看tx,rx上的数据。
-
如果有数据就说明OpenMV发送出去了,
如果没有数据没准你OpenMV的操作步骤不对,根本没运行程序。比如脱机运行的步骤之类的。
-
脱机用串口助手是能收到数据的
-
那可能是接线的问题?或者是测试的数据不一样。
-
import sensor, image, time from pyb import UART threshold = [(37, 67, 45, 84, 4, 68), #red # (0, 80, -70, -10, -0, 30), #green (25, 67, -37, 26, -63, -26)] #blue #设置红色的阈值,括号里面的数值分别是L A B 的最大值和最小值(minL, maxL, minA, # maxA, minB, maxB),LAB的值在图像左侧三个坐标图中选取。如果是灰度图,则只需 #设置(min, max)两个数字即可。 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time = 2000 ) sensor.set_auto_whitebal(False) #关闭白平衡。白平衡是默认开启的,在颜色识别中,需要关闭白平衡。 clock = time.clock() uart = UART(3, 115200) uart.init(115200, bits=8, parity=None, stop=1) #8位数据位,无校验位,1位停止位、 while(True): clock.tick() img = sensor.snapshot() blob = img.find_blobs(threshold, area_threshold=300) if blob: #如果找到了目标颜色 # print(blob) uart.write("B3 B3 ") #一帧数据的帧头 for b in blob: #迭代找到的目标颜色区域 img.draw_rectangle(b[0:4]) # rect img.draw_cross(b[5], b[6]) # cx, cy x = b.cx() y = b.cy() print(x, y, end = ',') uart.write("%x %x "%(x,y)) #以16进制的格式输出 #img.draw_circle((50, 50, 30), color = (250, 0, 0)) print(clock.fps())
这是我openmv上的代码,请看看有什么问题吗
-
我今天发现了,有的串口助手能给我的单片机发数据,有的不能,这是为什么呢,感觉和我遇到的问题很像
-
终于解决了,特地再来回复一下,希望以后的小伙伴不要在绕弯路了
转载自:https://blog.csdn.net/zzzzjh/article/details/80725348
penmv发送16进制数据需要转换为字节的形式,假设要发送 0x80,0x06,0x02,0x78这几个16进制数据代码如下:
uart = UART(3, 9600) #波特率9600
uart.init(9600, bits=8, parity=None, stop=1)
data=bytearray([0x80,0x06,0x02,0x78])
uart.write(data)
-
你上面代码
uart.write("%x %x "%(x,y))
的是字符串。
-
其实你要发送单个的数值(num)的时候只需要使用uart.writechar(num)就行了,uart.write()是发送字符串。
-
@17072969344 同学,您修改后的串口通信代码能再发一下吗?谢谢了