لا يمكن تأسيس اتصال RS485 مناسب

0

كنت أحاول الاتصال التسلسلي باستخدام ATmega32 . أولاً ، استخدمت RS232 ، باستخدام USB-to-RS232 لإنشاء الاستلام والإرسال باستخدام المطراف التسلسلي (في حالة tera term). مهما أرسل من Atmega32 المسلسل الطرفية صدى مرة أخرى.

على سبيل المثال. أنا أرسل Hello\r وأنا أتلقى "Hello \ r"

إنها تعمل بشكل جيد.

ثم استخدمت RS485 ، باستخدام USB إلى RS485 لإنشاء اتصال مع ATmega32 ولكني أحصل على الحرف الأول فقط في المقابل.

على سبيل المثال. إذا أرسلت Hello أعود H . إذا أرسلت planets أحصل فقط p فى المقابل.

هذا هو الرمز:

void Delay(int ms)
{
    int i;
    for (i=0;i<ms;i++)
    _delay_ms(1);

}

void UART_Init(unsigned int baud)
{
    UBRRH = (unsigned char)(baud >> 8);
    UBRRL = (unsigned char)baud;

    UCSRB = (1<<RXEN)  | (1<<TXEN) | (1<<RXCIE);
    UCSRC = (1<<URSEL) | (3<<UCSZ0);
}

void UART_Transmit(unsigned char data)
{
    UDR = data;
    while ( !( UCSRA & (1<<UDRE) ) );
}


void USART_Transmit_String( char *string)
{
    while (*string != 0)
    UART_Transmit(*string++);
}


void Clear_Buffer(char *string)
{
    while (*string != '\0')
    {
        *string = 0;
        string++;
    }
}

ISR(USART_RXC_vect)
{
    uartBuff[datapos] = UDR;
    if (uartBuff[datapos] == '\r')
    {
        eos = 1;
    }
    datapos++;
    if (datapos > SIZE)
    {
        datapos = 0;
        Clear_Buffer(uartBuff);
    }
}

int main(void)
{
    _delay_ms(1000);
    UART_Init(103);
    sei();
    LED_Enable();
    LED_High();
    Delay(100);
    LED_Low();
    Delay(100);

    RE_DE_Enable();
    RE_DE_High();
    USART_Transmit_String("Hello World");
    UART_Transmit(0x0d);
    UART_Transmit('\n');
    Delay(1000);
    datapos = 0;
    eos = 0;
    RE_DE_Low();
    while (1) 
    {
        if (strstr(uartBuff,"led on\r"))
        {
            LED_High();
        }
        if (strstr(uartBuff,"led off\r"))
        {
            LED_Low();
        }

        if (eos == 1)
        {
            RE_DE_High();
            uartBuff[datapos] = '\0';
            USART_Transmit_String("\r\n");
            USART_Transmit_String(uartBuff);
            USART_Transmit_String("\r\n");
            Clear_Buffer(uartBuff);
            datapos = 0;
            eos = 0;
            RE_DE_Low();
        }

    }
}

لماذا هذا النوع من الشذوذ؟

كيفية تصحيح هذا الخطأ؟

اي اقتراحات ستكون مفيدة

شكرا لك مقدما

2 الاجابة

3
افضل جواب

الحصول على القليل من الارتباك حول من ينقل ما في مراجعة هذا المنشور حتى يكون لديك التعليقات التالية:

1) تبسيط كود Atmel لتدفق "Hello World٪ d" + CR فقط والاستمرار في زيادة السطر #. في الوقت الحالي ، حافظ على سرعة com @ 9600 baud. هل يتم تلقي حركة المرور هذه من Atmel إلى USB RS485 dongle بنجاح 100٪؟ لا تستمر حتى يفعل ذلك.

2) أي جهاز مرسل مستقبل RS485 تستخدمه في هذا التصميم لجانب Atmel؟ يوجد الكثير من القمامة في السوق ولا يتم إنشاء جميع أجهزة الإرسال والاستقبال على قدم المساواة.

3) ما هو دونجل USB RS485 الذي تستخدمه؟ حسب (2) ، فقط عدد قليل موثوق. إذا كنت تستخدم دونجل FTDI USB RS485 الشفاف ، فعليك مراجعة بعناية أي جهاز مرسل مستقبل RS485 منقوش داخل البلاستيك. اعترفت FTDI أنها وضعت بعض الكابلات الدونجل المتقشرة على أساس جهاز الإرسال والاستقبال Sipex. من مراجعتنا الموجزة ، نعتقد أن التصميم كان على خطأ وليس جهاز الإرسال والاستقبال. ومع ذلك ، وبغض النظر عن أن الدونجل مغلق الآن ، فلا يمكن تصحيح نفس الدونجل.

نحن نبني بعض المحولات الصلبة ولكننا لا نرغب في تحويل هذا إلى إعلان ، لذا دعنا نرى ما إذا كان يمكننا تصحيح حالتك. انشر المزيد من التفاصيل للمتابعة.

ترغب في إضافة ذلك على دبوس استقبال RS485 الخاص بك ، تأكد من وجود مقاوم سحب محلي إلى + 3v3. هذا مطلوب للحصول على حالة عالية على استقبال Atmel لـ UART عندما يكون جهاز استقبال RS485 معطلاً. بمعنى ، عندما يتم تعطيل جهاز استقبال RS485 ، يكون دبوس RX عالي z. من المعروف أن قيمة 10 كيلو جيدة ولا تعد القيمة حاسمة ولكن ينصح بالرفع.

تحديث

أعتقد أنني أفهم وجهة نظر مشروعك. يرجى تصحيح إذا كنت مخطئا. هل تحاول استخدام دونجل Teraterm + USB RS485 لإرسال نص إلى Atmel عبر RS485 وترغب في أن يقوم Atmel بإعادة البيانات إلى Teraterm؟ إذا كانت الإجابة بنعم ، فإن النتائج منطقية إذا كنت تكتب هذه البيانات في Teraterm. يرجى تأكيد هذا الإعداد.

أي أنك تكتب "Hello world" وتتوقع تلقي هذا النص مرة أخرى؟

المشكلة في هذه الفكرة هي أن الكمبيوتر يرسل البيانات بشكل أسرع مما يمكنك كتابته. بدلاً من ذلك ، راجع كيف يمكنك استخدام Teraterm لإرسال سلسلة كاملة في كتلة ماكرو في شكل ماكرو. هذه الطريقة فقط ستعمل لفكرتك. أثناء الكتابة ، يرسل Teraterm (ويعرف أيضًا بمسح المخزن المؤقت tx) "H" عبر واجهة RS485 ، وما إلى ذلك ، لذا لن تتلقى السلسلة بأكملها في تلقي كتلة واحدة.

خذ بعين الاعتبار ماكرو مع Teraterm لإرسال "الكواكب" ، وما إلى ذلك في إرسال واحد. النقطة الأساسية هي عدم التأخير بين كل حرف ترغب في إرساله.

:مؤلف
0

يتطلب 485 تحكمًا دقيقًا في الخط عند إرسال البيانات. UDRE يعني أنه يمكن تحميل البيانات. TXC يعني أنه تم إرسال البيانات. يجب تحرير الخط فقط بعد إرسال البت الأخير. أعتقد أن هذا هو السبب في أنه يعمل في RS232 وفشل في RS485.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام