给你指出几处明显的错误。
1.resv没有最大值的限定,这样你的程序在运行的时候ch[resv]会指向不明地址,因为ch[]最大为10个字节。
2.某种程度上可以认为你的串口接收程序没有错误,但是你的串口接收程序是每次接收到一个字节就设置收到数据标志的,所以你发送数据应该每次发送一个字节。而你每次发送一个字符串,显然和你单片机上写的程序不符,所以会产生不明错误。
3.可能你想要的是每次发送多个字节,也就是一个字符串,然后将这个字符串一起发送到PC上。那你应该在串口中断里面设置一个判断,也就是说,中断里面判断到上位机发送的数据结束后,单片机的串口中断程序才设置标志位,然后根据标志位和接收到数据到数量,把所有的数据一次性发送给PC。
4.指出你出现异常的原因。因为串口在接收到1个字节后,resv=1,也就是ch[1]='H',这个时候标志位被设置,程序进入发送程序,响应的SBUF=a,将H发送出去。因为51单片机仅有一个串口缓存寄存器,这样发送的时候是没有办法接收的,而PC机不知道,还是在发送,也许这样导致的错误。
PC发送是一个字符串连续发送的,单片机在收到第一个字符时,就进入中断,同时置标志。
而你在主程序一检测到标志,立即关中断,接收自然停止了。
解决方法:1. 要同时收发的话,可以直接在中断内区分TI与RI,并写SBUF = a;2. 完全接收后再一并发送。
问题出在你发送时关掉中断,因为丢掉了数据造成的,解决的办法是:延时一段时间等待接收完毕后再发送,比如检测到有接收数据后,延时10毫秒,之后再发送回PC。