打印
[PIC®/AVR®/dsPIC®产品]

请问单片机串口连接问题

[复制链接]
826|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jinwe|  楼主 | 2020-3-3 21:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jinwe 于 2020-3-3 21:33 编辑

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

#include <xc.h>
#include "LCD1602.h"
#include "Uasrt.h"

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

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


//A/D中断函数
void __interrupt() ISR(void)
{
    if (ADIE && ADIF)
    {
        ADIF = 0;
        Data_Buf[3] = ADRESH;
        Data_Buf[4] = ADRESL;
        ADbuf = ADRESH * 256 + ADRESL; //将10位A/D转换结果暂存在ADbuf        
    }
}
//名称: 主函数

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

    RC7 = 0;
    TRISC7 = 0;

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

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

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

    InitUSART();

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

        for (char i = 0; i < 10; i++)
        {
            Send_Char(Data_Buf[i]);
        }




使用特权

评论回复
沙发
CoolSilicon| | 2020-3-4 09:49 | 只看该作者
用的是USB转串口工具  跟  877A通信?
怀疑是工具的问题.
你换一个USB转串口带隔离功能的工具看看.

使用特权

评论回复
板凳
jinwe|  楼主 | 2020-3-4 14:01 | 只看该作者
用的是电脑上位机跟877A通信,但是发现有个问题。就是单片机开机后一段时间后不运行上位机,再开上位机时会出现不能打开串口,把单片机关机后再开就好了。不知道从哪开始判断故障。串口线只有一根,没法换!

使用特权

评论回复
地板
CoolSilicon| | 2020-3-4 14:46 | 只看该作者
你就再买一个线..带隔离的usb转串口线....

使用特权

评论回复
5
jinwe|  楼主 | 2020-3-4 22:51 | 只看该作者
现在决得有可能是串口线的问题,出现问题时在设备管理器能看到串口,但是用上位机不能打开。用串口助手也打不开,抽掉串口线后再插上就好了。唉,现在在湖北,快递都不发货!

使用特权

评论回复
6
jie726| | 2020-3-6 17:41 | 只看该作者
学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

115

帖子

0

粉丝