Как я могу отправить строку последовательно от 8051 только ОДНАЖДЫ?

Контекст сервлета сделан доступным JAX-WS через контекст сообщения, который может быть получен с помощью контекста веб-сервиса. Вставка следующего участника заставит JAX-WS вводить ссылку на контекст веб-сервиса в Ваш веб-сервис:

import javax.annotation.Resource;
import javax.servlet.ServletContext;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

...

@Resource
private WebServiceContext context;

Затем можно получить доступ к использованию контекста сервлета:

ServletContext servletContext =
    (ServletContext) context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
6
задан dsolimano 2 October 2012 в 20:25
поделиться

5 ответов

Вы можете подтвердить что 8051 действительно отправляет данные только один раз? Один из способов проверки - это использовать осциллограф, чтобы увидеть, что происходит на выводе TX UART.

Какое программное обеспечение вы используете на ПК? Я бы предложил использовать простое коммуникационное программное обеспечение, такое как HyperTerminal или PuTTY . Если они показывают, что строка отправляется на ПК несколько раз, то, скорее всего, ошибка в программном обеспечении, работающем на 8051.

РЕДАКТИРОВАТЬ: Честно говоря, это похоже на отладку, которую проводят инженеры. встречаться на регулярной основе, и поэтому это хорошая возможность для вас практиковать старомодное методическое решение проблем.

Если я могу быть очень откровенен, я предлагаю вам сделать следующее:

  1. Отладка. Попробуйте, но не угадайте . Экспериментируйте. Внесите небольшие изменения в свой код и посмотрите, что произойдет. Попробуйте все, что только можете придумать. Поищите в Интернете дополнительную информацию.
  2. Если это не поможет, вернитесь сюда и предоставьте нам всю необходимую информацию. Это включает в себя соответствующие фрагменты кода, полную информацию об используемом вами оборудовании и информацию о том, что вы пробовали на шаге 1.

РЕДАКТИРОВАТЬ: У меня нет представителя, чтобы редактировать вопрос, поэтому вот код, опубликованный OP в комментарии к ее вопросу:

#include<reg51.h>

void SerTx(unsigned char);

void main(void)
{
    TMOD = 0x20; TH1 = 0xFD; SCON = 0x50; TR1 = 1;
    SerTx('O'); SerTx('N'); SerTx('L'); SerTx('Y');

    void SerTx(unsigned char x)
        { SBUF = x; while(TI==0); TI = 0; } 
}

Как упоминают Нил и Бруксмос в своих ответах, во встроенной системе выполнение функции main никогда не завершается. Таким образом, вам нужно либо поместить ваш код в бесконечный цикл (что может быть непреднамеренно), либо добавить бесконечный цикл в конце, чтобы программа фактически остановилась.

Кроме того, функция SerTx должна быть определена вне main . Это может быть синтаксически правильным, но упрощает задачу, не объявляя функции в других функциях.

Так что попробуйте это (я также добавил несколько комментариев, чтобы упростить понимание кода):

#include<reg51.h>

void SerTx(unsigned char);

void main(void)
{
    /* Initialise (need to add more explanation as to what
        each line means, perhaps by replacing these "magic
        numbers" with some #defines) */
    TMOD = 0x20;
    TH1  = 0xFD;
    SCON = 0x50;
    TR1  = 1;

    /* Transmit data */
    SerTx('O'); SerTx('N'); SerTx('L'); SerTx('Y');

    /* Stay here forever */
    for(;;) {}

}

void SerTx(unsigned char x)
{
    /* Transmit byte */
    SBUF = x;

    /* Wait for byte to be transmitted */
    while(TI==0) {}

    /* Clear transmit interrupt flag */
    TI = 0;
} 
6
ответ дан 8 December 2019 в 16:08
поделиться

Трудно сказать, в чем проблема, не увидев кода 8051. Например, логическая ошибка на этой стороне может привести к тому, что данные будут отправлены несколько раз, или программное обеспечение 8051 может ожидать ACK, который никогда не получен, и т. Д.

Обычно на 8051 код должен явно отправлять каждый символ , но я предполагаю, что об этом позаботится среда выполнения C.

Использование RTS / CTS (Request To Send / Clear To Send) предназначено для управления потоком (т.е. для предотвращения переполнения буфера - буферы обычно довольно маленькие на этих микроконтроллерах) и не прекращать передачу полностью.

2
ответ дан 8 December 2019 в 16:08
поделиться

Опубликованный вами код не имеет цикла в main (), поэтому вам нужно определить, что делает среда выполнения C вашего компилятора, когда main () возвращается после отправки 'Y'. Учитывая вашу проблему, я предполагаю, что компилятор генерирует некоторый код для выполнения некоторой очистки, а затем перезапускает микроконтроллер (возможно, аппаратный сброс, может быть, просто перезапускает среду выполнения C). Похоже, ваша программа работает именно так, как вы ее написали, но вы проигнорировали то, что происходит до и после вызова main ().

Если вы хотите, чтобы ваша строка отправлялась один раз и только один раз, тогда вам нужно что-то например, , а (1) {} добавляется после отправки последнего символа. Но тогда ваша программа ничего не делает - она ​​просто всегда будет выполнять пустой цикл. Сброс (например, включение и выключение) необходим для повторного запуска и отправки строки.

Обратите внимание, что если в вашем микроконтроллере есть сторожевой таймер, он может вмешаться и вызвать неожиданный сброс. Если это произойдет, ваша строка будет отправляться один раз для каждого сброса сторожевого таймера (что может происходить примерно раз в секунду, со скоростью, зависящей от вашего оборудования).

Кроме того, определение serTx (), вложенного в main (), вероятно, будет не то, что вы хотите.

6
ответ дан 8 December 2019 в 16:08
поделиться

Эта конкретная статья предназначена для сборки, а не для C, но она может оказаться полезной: http://www.8052.com/tutser.phtml

-1
ответ дан 8 December 2019 в 16:08
поделиться

Повторение ответа Нила (в ответе, поскольку у меня еще нет репутации для комментариев): в типичной ситуации с микроконтроллером без ОС не сразу понятно, что за функция exit () который неявно вызывается в конце main (), должен сработать - или, точнее, он не может выполнить обычное «завершение программы и возврат в ОС», потому что нет ОС, к которой можно было бы вернуться.

Более того, , в реальном приложении вы почти никогда не хотите, чтобы программа просто остановилась, если вы не выключите систему. Поэтому одна вещь, которую реализация exit () определенно не должна делать, - это занимать много места в коде.

В некоторых системах, над которыми я работал, exit () на самом деле вообще не реализована - если вы не собираюсь использовать его, даже не тратьте на это байт! В результате, когда путь выполнения доходит до конца main (), чип просто уходит в область лала выполнения всего, что происходит в следующем бите памяти, и обычно быстро заканчивается либо застреванием в цикле, либо ошибка с недопустимым кодом операции. И обычным результатом ошибки с недопустимым кодом операции является ... перезагрузка чипа.

Это похоже на правдоподобную теорию того, что здесь происходит.

2
ответ дан 8 December 2019 в 16:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: