[PIC®/AVR®/dsPIC®产品] 请问单片机串口连接问题

[复制链接]
 楼主| jinwe 发表于 2020-3-3 21:28 | 显示全部楼层 |阅读模式
本帖最后由 jinwe 于 2020-3-3 21:33 编辑

用的是877A,往串口发送一组数据。在调试的过程中发现一个问题,单片机发送数据后,如果上位机没运行,过一会后,可能十几分钟,上位机运行连接串口时会出现连不上串口 的提示,显示没有此串口或此串口被占用。这时单片机应该还在正常工作,因为的的LCD1602还能正常显示AD转换的数值。如果将单片机关闭后再开,就能正常连接。上位机能显示正确的数值。上位机如果一直运行的话好像没问题,请问这个问题应该从哪方面入手查错?谢谢了,用的是USB转串口线。
  1. // PIC16F877A 配制字设置
  2. // CONFIG
  3. #pragma config FOSC = HS        // 高速晶振4M以上
  4. #pragma config WDTE = OFF       // 看门狗关闭
  5. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  6. #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
  7. #pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
  8. #pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
  9. #pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
  10. #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

  11. #include <xc.h>
  12. #include "LCD1602.h"
  13. #include "Uasrt.h"

  14. //发送的数据
  15. unsigned char Data_Buf[10] = {0xAA, 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA};

  1. /---------------------------------------
  2. //A/D转换用寄存器设置
  3. unsigned int ADbuf = 0; //10位A/D转换,设置16位的unsigend int型寄存器用来暂存A/D转换结果
  4. //---------------------------------------


  5. //A/D中断函数
  6. void __interrupt() ISR(void)
  7. {
  8.     if (ADIE && ADIF)
  9.     {
  10.         ADIF = 0;
  11.         Data_Buf[3] = ADRESH;
  12.         Data_Buf[4] = ADRESL;
  13.         ADbuf = ADRESH * 256 + ADRESL; //将10位A/D转换结果暂存在ADbuf        
  14.     }
  15. }
  1. //名称: 主函数

  2. void main(void) //主函数,单片机开机后就是从这个函数开始运行
  3. {
  4.     TRISA = 0B11111111; //初始化RA5-RA0的输入输出方向
  5.     TRISB = 0B11000111; //初始化RB7-RB0的输入输出方向
  6.     TRISD = 0B00000000; //初始化RD7-RD0的输入输出方向
  7.     PORTA = 0B00000000; //初始化RA5-RA0数值
  8.     PORTB = 0B00000000; //初始化RB7-RB0的数值
  9.     PORTD = 0B00000000; //初始化RD7-RD0的数值

  10.     RC7 = 0;
  11.     TRISC7 = 0;

  12.     LCD1602_init(); //调用1602液晶初始化函数
  13.     LCD1602_DispString(2, 0, "--AN0 TEST--");
  14.     LCD1602_DispString(2, 1, "   AD=");

  15.     //A/D参数设置
  16.     ADCON1 = 0B10000000; //设置数据右对齐
  17.     ADCON0 = 0B00000001; //选择AN0通道准备进行A/D转换,启动A/D模块

  18.     ADIE = 1; //允许产生AD中断
  19.     ADIF = 0; //A/D标志位清零
  20.     PEIE = 1; //允许外设中断
  21.     GIE = 1; //打开总中断

  22.     InitUSART();

  23.     while (1) //死循环,单片机初始化后,将一直运行这个死循环
  24.     {
  25.         GO_DONE = 1;
  26.         ADbuf =Data_Buf[3] * 256 + Data_Buf[4];
  27.         //***1602液晶显示0-255***
  28.         LCD1602_Disp(8, 1, (ADbuf / 1000) + '0'); //在第2行的第9列显示仟位
  29.         LCD1602_Disp(9, 1, ((ADbuf % 1000) / 100) + '0'); //在第2行的第10列显示百位
  30.         LCD1602_Disp(10, 1, (ADbuf % 100) / 10 + '0'); //在第2行的第11列显示十位
  31.         LCD1602_Disp(11, 1, ADbuf % 10 + '0'); //在第2行的第12列显示个位

  32.         for (char i = 0; i < 10; i++)
  33.         {
  34.             Send_Char(Data_Buf[i]);
  35.         }




CoolSilicon 发表于 2020-3-4 09:49 | 显示全部楼层
用的是USB转串口工具  跟  877A通信?
怀疑是工具的问题.
你换一个USB转串口带隔离功能的工具看看.
 楼主| jinwe 发表于 2020-3-4 14:01 | 显示全部楼层
用的是电脑上位机跟877A通信,但是发现有个问题。就是单片机开机后一段时间后不运行上位机,再开上位机时会出现不能打开串口,把单片机关机后再开就好了。不知道从哪开始判断故障。串口线只有一根,没法换!
CoolSilicon 发表于 2020-3-4 14:46 | 显示全部楼层
你就再买一个线..带隔离的usb转串口线....
 楼主| jinwe 发表于 2020-3-4 22:51 | 显示全部楼层
现在决得有可能是串口线的问题,出现问题时在设备管理器能看到串口,但是用上位机不能打开。用串口助手也打不开,抽掉串口线后再插上就好了。唉,现在在湖北,快递都不发货!
jie726 发表于 2020-3-6 17:41 | 显示全部楼层
学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

115

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部