迪文科技论坛

 找回密码
 立即注册
搜索
查看: 418|回复: 2

【提问】串口接收不到数据 可以发送数据

[复制链接]

6

主题

48

回帖

440

积分

中级会员

Rank: 3Rank: 3

积分
440
发表于 2025-4-1 17:10:06 | 显示全部楼层 |阅读模式
#include "sys.h"
#include "LCD_UartDriver.h"
#include "T5LOS8051.h"
#include "LCD_Can.h"
#include "LCD_GlobalVarDef.h"


#define        Uart4_Tx_Lenth        14
#define        Uart4_Rx_Lenth        14

//============================
//                模块内常量定义
//============================
#define C_SCI_DATA_LENGTH    14

struct Uartx_Define Uart4;
struct Uartx_Define Uart2;
//============================
//                静态局部变量定义
//============================
static        uint8_t        u8SciProcessStep;                        // 通信过程状态机状态        
static        uint8_t        u8SciBytePoint = 0;                        // 发送和接收数据指针
static        uint8_t        u8SciReceEndTimer = 0;                // 接收状态计时器


#if UART2_ENABLE
u8 xdata R_u2[UART2_RX_LENTH];
#else
u8 xdata R_u2[20];
#endif

u8 xdata R_OD2 = 0;         
u16 xdata R_CN2 = 0;
u8 xdata T_O2 = 0;         
bit Busy2 = 0;                 

#if UART3_ENABLE
u8 xdata R_u3[UART3_RX_LENTH];
#else
u8 xdata R_u3[20];
#endif
u8 xdata R_OD3 = 0;         
u16 xdata R_CN3 = 0;
u8 xdata T_O3 = 0;         
bit Busy3 = 0;                 

#if UART4_ENABLE
u8 xdata R_u4[UART4_RX_LENTH];
#else
u8 xdata R_u4[20];
#endif

u8 xdata R_OD4 = 0;         
u16 xdata R_CN4 = 0;
u8 xdata T_O4 = 0;         
bit Busy4 = 0;                 

#if UART5_ENABLE
u8 xdata R_u5[UART5_RX_LENTH];
#else
u8 xdata R_u5[20];
#endif

u8 xdata R_OD5 = 0;         
u16 xdata R_CN5 = 0;
u8 xdata T_O5 = 0;         
bit Busy5 = 0;                 


bit Response_flog = 0;         
bit Auto_data_upload = 0;
bit Crc_check_flog = 0;         



const u8 crctablehi[] = {
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
        0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
        0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
        0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
        0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
        0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
        0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
        0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
        0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
        0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
        0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
        0x40
};

const u8 crctablelo[] = {
        0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
        0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
        0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
        0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
        0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
        0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
        0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
        0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
        0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
        0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
        0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
        0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
        0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
        0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
        0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
        0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
        0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
        0x40
};

u16 crc16table(u8 *ptr, u16 len)
{
        u8 crchi = 0xff;
        u8 crclo = 0xff;
        u16 index;
        while (len--)
        {
                index = crclo ^ *ptr++;
                crclo = crchi ^ crctablehi[index];
                crchi = crctablelo[index];
        }
        return (crchi << 8 | crclo);
}

void uart_init()
{
#if UART2_ENABLE
        Uart2_Init(BAUD_UART2);
#endif
#if UART3_ENABLE
        Uart3_Init(BAUD_UART3);
#endif
#if UART4_ENABLE
        Uart4_Init(BAUD_UART4);
#endif
#if UART5_ENABLE
        Uart5_Init(BAUD_UART5);
#endif
}


void  uart_send_byte(u8 Uart_number, u8 Dat)
{
        if (Uart_number == 2)
        {
                while (Busy2)
                        ;
                Busy2 = 1;
                SBUF2 = Dat;
        }
        else if (Uart_number == 3)
        {
                while (Busy3)
                        ;
                Busy3 = 1;
                SBUF3 = Dat;
        }
        else if (Uart_number == 4)  //原工程这里有问题
        {
                while (Uart4.Tx_Busy)
                        ;
                Uart4.Tx_Busy = 1;
                SBUF4_TX = Dat;
        }
        else if (Uart_number == 5)
        {
                while (Busy5)
                        ;
                Busy5 = 1;
                SBUF5_TX = Dat;
        }
}
#if 1

void uart_send_str(u8 U_number, u8 *Str, u8 Len)
{
        u8 i = 0;
        if (U_number == 4)
                TR4 = 1;
        else if (U_number == 5)
                TR5 = 1;
        for (i = 0; i < Len; i++)
        {
                uart_send_byte(U_number, *Str++);
        }
        if (U_number == 4)
        {
                while (Uart4.Tx_Busy)
                        ;
                TR4 = 0;
        }
        else if (U_number == 5)
        {
                while (Busy5)
                        ;
                TR5 = 0;
        }
}
#endif

void uart_data_send(u8 *Arr, u8 Uartnum, bit Outo_send, bit Crc_ck)
{
        u8 i = 0;
        u16 V1 = Read_Dgus(0x0f01);
        Auto_data_upload = Outo_send;
        if (Auto_data_upload)
        {
                Crc_check_flog = Crc_ck;
                if (Crc_check_flog)
                {
                        u16 Crc = 0;
                        Arr[2] = (((u8)V1) << 1) + 6;
                        Crc = crc16table(Arr + 3, Arr[2] - 2);
                        Arr[Arr[2] + 1] = Crc & 0x00FF;
                        Arr[Arr[2] + 2] = Crc >> 8;
                        uart_send_str(Uartnum, Arr, Arr[2] + 3);
                        Arr[2] = (((u8)V1) << 1) + 4;
                }
                else
                {
                        uart_send_str(Uartnum, Arr, Arr[2] + 3);
                }
        }
}








void Uart4_Init(u32 baud_rate){
        u16 i;

        Uart4.id = 2;
        Uart4.Tx_Read = 0;
        Uart4.Tx_Write = 0;
        Uart4.Tx_Busy = 0;
        Uart4.Rx_Read = 0;
        Uart4.Rx_Write = 0;
        Uart4.Rx_Busy = 0;
        Uart4.Rx_Flag = Uart_Rev_Pre;
        
        for(i = 0; i < Uart4_Tx_Lenth; i++) Uart4.Tx_Buffer = 0;
        for(i = 0; i < Uart4_Rx_Lenth; i++) Uart4.Rx_Buffer = 0;
          i=FOSC/8/baud_rate;
        SCON2T= 0x80        ;
        SCON2R= 0x80;
        ES2R = 1;
    ES2T = 1;
        BODE2_DIV_H = (u8)(i>>8);               
        BODE2_DIV_L = (u8)i;   

}

void Uart4_Tx_write4buff(u8 dat){
        Uart4.Tx_Buffer[Uart4.Tx_Write] = dat;                                       

        if(Uart4.Tx_Read > Uart4.Tx_Write){                                                        
                while((Uart4.Tx_Write) + 1 == Uart4.Tx_Read);        
        }

        ++Uart4.Tx_Write;                                                                                                        
        if(Uart4.Tx_Write >= Uart4_Tx_Lenth){                        
                while(Uart4.Tx_Read == 0);                                                        
                Uart4.Tx_Write = 0;                                                                                       
        }

        if(Uart4.Tx_Busy == 0){                                
                Uart4.Tx_Busy = 1;                                       
                SCON2T|=0x1 ;                                                                                 
        }
}

void Uart4_RX_ISR_PC(void) interrupt 11
{
        u8 res = 0;
        EA = 0;
    SCON2R&=0xFE;
                if(!Uart4.Rx_Busy)
                {
                        Uart4.Rx_Buffer[Uart4.Rx_Write] = SBUF0;
                        Uart4.Rx_Write++;
                        Uart4.Rx_Write %= Uart4_Rx_Lenth;
                        if(Uart4.Rx_Write == Uart4.Rx_Read)
                                Uart4.Rx_Busy = 1;
                }
        
        EA = 1;

        // if(RI0 == 1)
        // {
        //         RI0 = 0;
        //         if(!Uart4.Rx_Busy)
        //         {
        //                 Uart4.Rx_Buffer[Uart4.Rx_Write] = SBUF0;
        //                 Uart4.Rx_Write++;
        //                 Uart4.Rx_Write %= Uart4_Rx_Lenth;
        //                 if(Uart4.Rx_Write == Uart4.Rx_Read)
        //                         Uart4.Rx_Busy = 1;
        //         }
        // }
}


void Uart4_TX_ISR_PC(void) interrupt 10
{
        u8 res = 0;
        EA = 0;
                SCON2T&=0xFE ;
                if(Uart4.Tx_Read != Uart4.Tx_Write){
                        SBUF2_TX = Uart4.Tx_Buffer[Uart4.Tx_Read];
                        Uart4.Tx_Read++;
                        Uart4.Tx_Read %= Uart4_Tx_Lenth;
                }else{
                        Uart4.Tx_Busy = 0;
                }
        
        EA = 1;
}
//============================
//                内部函数声明
//============================


//******************************************************************
// 函数名                :        void SciDriveInit(void)
// 作者                        :        Oswald
// 功能                        :        初始化SCI底层驱动
// 参数                        :        无
// 返回值                :        无
// 调用全局变量        :        无
// 修改全局变量        :        无
// 备注                        :                1、寄存器配置已在MCUInit.c中自动生成
//                                2、此函数在MIGWELDERU1_Init.c中调用一次
//******************************************************************
void SciDriveInit(void)
{
        u8SciProcessStep = C_SCI_LEISURE;
}


//******************************************************************
// 函数名                :        void SciDriverFun(void)
// 作者                        :        Oswald
// 功能                        :        向SCI发送寄存器更新数据并从接收寄存器中读回数据
// 参数                        :        无
// 返回值                :        无
// 调用全局变量        :        无
// 修改全局变量        :        无
// 备注                        :        此函数在主循环中每1ms调用一次
//******************************************************************
void SciDriverFun(void)
{
        uint8_t        t_u8Temp;
        uint8_t i = 0;
        
        g_u8SciSendTemp[0] =  Uart4.Rx_Buffer[0];
        g_u8SciSendTemp[1] =  Uart4.Rx_Buffer[1];
        g_u8SciSendTemp[2] =  Uart4.Rx_Buffer[2];
        g_u8SciSendTemp[3] =  Uart4.Rx_Buffer[3];
        g_u8SciSendTemp[4] =  Uart4.Rx_Buffer[4];
        g_u8SciSendTemp[5] =  Uart4.Rx_Buffer[5];
        g_u8SciSendTemp[6] =  Uart4.Rx_Buffer[6];
        g_u8SciSendTemp[7] =  Uart4.Rx_Buffer[7];
        g_u8SciSendTemp[8] =  Uart4.Rx_Buffer[8];
        g_u8SciSendTemp[9] =  Uart4.Rx_Buffer[9];
        g_u8SciSendTemp[10] = Uart4.Rx_Buffer[10];
        g_u8SciSendTemp[11] = Uart4.Rx_Buffer[11];
        //uart_send_byte(4,0x22);
        //Uart4_Tx_write4buff(0x55);
        uart_send_str(4,&g_u8SciSendTemp[0],C_SCI_SEND_BUFF_LENGTH);
}


回复

使用道具 举报

0

主题

481

回帖

2895

积分

金牌会员

Rank: 6Rank: 6

积分
2895
发表于 2025-4-1 19:15:07 | 显示全部楼层
移植的时候,先全部移过去,保证功能是完好的,再一点点注释掉不需要的,这样可以很好的降低故障率。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

6

主题

48

回帖

440

积分

中级会员

Rank: 3Rank: 3

积分
440
 楼主| 发表于 2025-4-2 08:27:40 | 显示全部楼层
好的,谢谢你
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2026-4-15 02:50 , Processed in 0.067858 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表