RS485接收数据不正常

2019-08-14 06:21发布

我的主程序较短时一切功能正常,但随着代码的增加出现了数据接收错误和接收不到数据。不明白什么原因,求指教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
xx3360765
2019-08-14 19:11
main.c//////////////////
#include "gpio.h"
#include "usart.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include "misc.h"
#include <string.h>
#include "md5.h"
#define p 5
// Hash magic number
#define        HASH_MAGIC 0xC32DB952        //hash&#196;§êy
unsigned char Input[100];//={0};//={0,1,2,3,4,5,6,7,8,9}; //= {0xC3,0x2D,0xB9,0x52,0,0,1,0,18,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
unsigned char Counter = 0;
unsigned char t;
unsigned char z = 1;

int Delay(int x)
{
    int i, y;
    for(i = 0; i < x; i++)
        for(y = 0; y < 72; y++);
    return 0;
}



int main(void)
{
    unsigned char i, y, a, b, c, d, e, f, g, k, temp;
    unsigned char LEDOutputData[128] = {0};
    unsigned char OutputData[18];
    unsigned char Hash[4], Response[10];
    int h, InputData[100];
    unsigned char decrypt[16];
    MD5_CTX md5;
    y = 0;
    SystemInit();
    GPIO_Initial();
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    USART1_Initial();

    /*&#189;óê&#213;RS485′&#171;à′μ&#196;êy&#190;Yμ&#196;′ú&#194;&#235;2¢&#189;&#171;êy&#190;Y′&#230;&#212;úêy×éInput&#214;D*/
    while(1)
    {
                                RS485_DIR_RX;
        d = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
        c = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);
        b = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2);
        a = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3);
        t = (a << 3) + (b << 2) + (c << 1) + d;

        if((USART_GetITStatus(USART1, USART_IT_RXNE) == RESET)&&z==0 ) //&#197;D&#182;&#207;êy&#190;Yê&#199;·&#241;′&#171;&#203;ííê
        {
                                                        for(i = 0; i < 100; i++)
                            {
                                                                                                                        printf("%d,%d ",i,Input[i]);
                                                                                                                        Delay(100);
                            }
                                        Hash[0] = Input[0];
            Hash[1] = Input[1];
            Hash[2] = Input[2];
            Hash[3] = Input[3];
            Input[0] = (HASH_MAGIC >> 24) & 0xFF;
            Input[1] = (HASH_MAGIC >> 16) & 0xFF;
            Input[2] = (HASH_MAGIC >> 8) & 0xFF;
            Input[3] = HASH_MAGIC & 0xFF;

            MD5Init(&md5);
            MD5Update(&md5, Input, Counter);
            MD5Final(decrypt, &md5);
            Counter = 0;
            if(Hash[0] == decrypt[12] && Hash[1] == decrypt[13] && Hash[2] == decrypt[14] && Hash[3] == decrypt[15])
            {
                Response[9] = 0x00;
                h = Input[4];
                h = (h << 8) + Input[5];
                if(h == t)
                {
                    if(Input[6] == 1)
                    {
                        h = Input[7];
                        h = (h << 8) + Input[8];
                        k = (h - 16) / 2;
                                                                                        for(i = 0; i < k; i++)
                        {
                            h = Input[25 + i * 2];
                            InputData[i] = (h << 8) + Input[26 + i * 2];
                        }

                      for(y = 0; y < k; y++)
                        {
                            if(InputData[y] % 10 != 0)
                            {
                                e = InputData[y] / 10;
                                f = InputData[y] % 10;
                            }
                            else
                            {
                                e = InputData[y] / 10 - 1;
                                f = 10;
                                                                                                                }
                                                                                                                for(i = 0; i < 18; i++)
                            {
                                if(i == (f + 7) || i == e)
                                    OutputData[i] = 1;
                                else
                                    OutputData[i] = 0;
                            }//éú3éê&#228;3&#246;êy&#190;Yμ&#196;êy×é

                            for(i = 0; i < 4; i++)
                            {
                                temp = OutputData[i];
                                OutputData[i] = OutputData[7 - i];
                                OutputData[7 - i] = temp;
                            }

                            for(i = 8; i < 12; i++)
                            {
                                temp = OutputData[i];
                                OutputData[i] = OutputData[23 - i];
                                OutputData[23 - i] = temp;
                            }//&#189;&#171;ê&#228;3&#246;êy&#190;Y×a&#187;&#187;3éó&#235;ó2&#188;t&#182;&#203;&#191;ú&#207;à&#182;&#212;ó|μ&#196;D&#206;ê&#189;//&#184;ù&#190;Y′ò&#191;a1&#241;×óμ&#196;o&#197;&#194;&#235;&#188;&#198;&#203;&#227;3&#246;ê&#228;3&#246;D&#197;o&#197;&#196;&#196;á&#189;&#206;&#187;&#214;&#195;0
                                                                                                 for(i = 1; i <= 8; i++)
                            {
                                temp = OutputData[i - 1];
                                OutputData[i - 1] = OutputData[16 - i];
                                OutputData[16 - i] = temp;
                            }

                            //ê&#228;3&#246;&#199;°ê&#174;áù&#206;&#187;êy&#190;Y
                            for(i = 0; i < 16; i++)
                            {
                                GPIO_WriteBit(GPIOB, GPIO_Pin_1, 0); //CLK
                                GPIO_WriteBit(GPIOB, GPIO_Pin_0, OutputData[i]); //SER
                                GPIO_WriteBit(GPIOB, GPIO_Pin_1, 1); //CLK
                            }
                            GPIO_WriteBit(GPIOB, GPIO_Pin_2, 1); //LAT
                            GPIO_WriteBit(GPIOB, GPIO_Pin_2, 0); //LAT

                            GPIO_WriteBit(GPIOB, GPIO_Pin_6, OutputData[16]); //ê&#228;3&#246;μúê&#174;&#198;&#223;&#206;&#187;êy&#190;Y
                            GPIO_WriteBit(GPIOB, GPIO_Pin_7, OutputData[17]); //ê&#228;3&#246;μúê&#174;°&#203;&#206;&#187;êy&#190;Y
                            Delay(50000);
                            for(i = 0; i < 16; i++)
                            {
                                GPIO_WriteBit(GPIOB, GPIO_Pin_1, 0); //CLK
                                GPIO_WriteBit(GPIOB, GPIO_Pin_0, 0); //SER
                                GPIO_WriteBit(GPIOB, GPIO_Pin_1, 1); //CLK
                            }
                            GPIO_WriteBit(GPIOB, GPIO_Pin_2, 1); //LAT
                            GPIO_WriteBit(GPIOB, GPIO_Pin_2, 0); //LAT

                            GPIO_WriteBit(GPIOB, GPIO_Pin_6, 0);
                            GPIO_WriteBit(GPIOB, GPIO_Pin_7, 0); //&#184;′&#206;&#187;1&#241;×ó×′ì&#172;

                                                                                                }
                                                                                                for(y = 0; y < k; y++)
                        {

                            if(InputData[y] % 10 != 0)
                                g = (InputData[y] / 10) * 6 + InputData[y] - 1;
                            else
                                g = (InputData[y] / 10 - 1) * 6 + InputData[y] - 1;
                            for(i = 0; i < 128; i++)
                                LEDOutputData[g] = 1; //óéê&#228;è&#235;êy&#190;Y&#188;&#198;&#203;&#227;3&#246;ò&#198;&#206;&#187;&#188;&#196;′&#230;&#198;÷μ&#196;μú&#188;&#184;&#206;&#187;ê&#228;3&#246;&#206;a0
                        }
                                                                        for(i = 0; i < 8; i++)
                        {
                            temp = LEDOutputData[8 + 16 * i];
                            LEDOutputData[8 + 16 * i] = LEDOutputData[15 + 16 * i];
                            LEDOutputData[15 + 16 * i] = temp;
                            temp = LEDOutputData[9 + 16 * i];
                            LEDOutputData[9 + 16 * i] = LEDOutputData[14 + 16 * i];
                            LEDOutputData[14 + 16 * i] = temp;
                        }//&#189;&#171;ê&#228;3&#246;êy&#190;Y×a&#187;&#187;3éó&#235;ó2&#188;t&#182;&#203;&#191;ú&#207;à&#182;&#212;ó|μ&#196;D&#206;ê&#189;

                        /*&#189;&#171;êy&#190;Y×a&#187;&#187;3éSM16126μ&#196;ê&#228;3&#246;D&#206;ê&#189;*/
                        for(i = 1; i <= 128; i = i + 16)
                        {
                            for(y = 1; y <= 8; y++)
                            {
                                temp = LEDOutputData[y + i - 2];
                                LEDOutputData[y + i - 2] = LEDOutputData[i + 15 - y];
                                LEDOutputData[i + 15 - y] = temp;
                            }
                        }

                        for(y = 0; y < 10; y++)
                        {
                            for(i = 0; i < 16; i++)
                            {
                                GPIO_WriteBit(GPIOB, GPIO_Pin_9, 0); //CLK
                                GPIO_WriteBit(GPIOB, GPIO_Pin_8, LEDOutputData[i]); //SER
                                GPIO_WriteBit(GPIOB, GPIO_Pin_9, 1); //CLK
                            }
                            GPIO_WriteBit(GPIOB, GPIO_Pin_10, 1); //LAT
                            GPIO_WriteBit(GPIOB, GPIO_Pin_10, 0); //LAT//&#203;&#248;′&#230;êy&#190;Y£&#172;ê1&#182;&#212;ó|μ&#196;μ&#198;áá

                            Delay(50000);
                            for(i = 0; i < 16; i++)
                            {
                                GPIO_WriteBit(GPIOB, GPIO_Pin_9, 0); //CLK
                                GPIO_WriteBit(GPIOB, GPIO_Pin_8, 0); //SER
                                GPIO_WriteBit(GPIOB, GPIO_Pin_9, 1); //CLK
                            }
                            GPIO_WriteBit(GPIOB, GPIO_Pin_10, 1); //LAT
                            GPIO_WriteBit(GPIOB, GPIO_Pin_10, 0); //LAT
                            Delay(50000);
                        }//ê1μ&#198;éá&#203;&#184;

                    }

              }
            }
            else
                Response[9] = 0x01;
            Response[0] = Input[0];
            Response[1] = Input[1];
            Response[2] = Input[2];
            Response[3] = Input[3];
            Response[4] = Input[4];
            Response[5] = Input[5];
            Response[6] = Input[6];
            Response[7] = 0x00;
            Response[8] = 0x01;
                                                RS485_DIR_TX;
            for(i = 0; i < 10; i++)
                USART_SendData(USART1, (uint16_t)Response[i]);
            z = 1;
        }
        else
        {
            for(i = 0; i < 128; i++)
            {
                GPIO_WriteBit(GPIOB, GPIO_Pin_9, 0); //CLK
                if((y * 16) <= i && i < ((y + 1) * 16))

                    GPIO_WriteBit(GPIOB, GPIO_Pin_8, 1); //SER


                else
                    GPIO_WriteBit(GPIOB, GPIO_Pin_8, 0); //SER
                GPIO_WriteBit(GPIOB, GPIO_Pin_9, 1); //CLK
            }
            GPIO_WriteBit(GPIOB, GPIO_Pin_10, 1); //LAT
            GPIO_WriteBit(GPIOB, GPIO_Pin_10, 0); //LAT//&#203;&#248;′&#230;êy&#190;Y£&#172;ê1&#182;&#212;ó|μ&#196;μ&#198;áá

            Delay(50000);
            for(i = 0; i < 128; i++)
            {
                GPIO_WriteBit(GPIOB, GPIO_Pin_9, 0); //CLK
                GPIO_WriteBit(GPIOB, GPIO_Pin_8, 0); //SER
                GPIO_WriteBit(GPIOB, GPIO_Pin_9, 1); //CLK
            }
            GPIO_WriteBit(GPIOB, GPIO_Pin_10, 1); //LAT
            GPIO_WriteBit(GPIOB, GPIO_Pin_10, 0); //LAT
            Delay(50000);
            if(y < 7)
                y++;
            else
                y = 0;
            //ê1μ&#198;éá&#203;&#184;
        }
   
        }
}



一周热门 更多>