Проект связи через последовательный порт - PullRequest
1 голос
/ 29 сентября 2011

Я делаю последний год проект по системе отображения парковки.По сути, он обнаруживает любые машины на стоянке, обновляет количество доступных лотов и показывает, заполнен он или нет.

У меня проблемы с написанием программы на C # с использованием Microsoft Visual Studio 2008.Я получаю данные от последовательного порта, через который отправляет мой другой напарник.Все, что мне нужно сделать, это получить данные, а затем прочитать данные.Это просто для того, чтобы смоделировать автомобильные участки, занятые и опустошенные.Мне нужно отредактировать свою программу, чтобы я мог получать и обновлять данные о партиях, независимо от того, занята она или нет, и вызывать другие функции.Получение данных будет в ascii.каждый лот будет назначен на конкретную ascii.Например, 0x5A для лота 1, 0x59 для лота 2 и т. Д.

Вот пример моего проекта.

    int intNumberLots = 6;

    SerialPort serialPort = new SerialPort("COM1");

    serialPort.BaudRate = 115200;
    serialPort.Parity = Parity.None;
    serialPort.StopBits = StopBits.One;
    serialPort.DataBits = 8;
    serialPort.Handshake = Handshake.None;

    serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

    serialPort.Open();

    private void startButton_Click(object sender, EventArgs e)
    {
       while(){ 
        if (serialPort.ReadLine == "0x57" && intNumberLots >= 0)     //  if data received is "1", do tasks below
        {
            inputTextBox.Clear();   // clear input textbox
            pictureBox1.Visible = true;     // show a picture of a vehicle
            intNumberLots--;    // decrease the number of available parking lots shown
            label9.Text = intNumberLots.ToString();

        }
        else if (serialPort.ReadLine == "0x58" && intNumberLots >= 0)
        {
            inputTextBox.Clear();
            pictureBox2.Visible = true;
            intNumberLots--;
            label9.Text = intNumberLots.ToString();

        }
        else if (serialPort.ReadLine == "0x59" && intNumberLots >= 0)
        {
            inputTextBox.Clear();
            pictureBox3.Visible = true;
            intNumberLots--;
            label9.Text = intNumberLots.ToString();

        }
        else if (serialPort.ReadLine == "0x5A" && intNumberLots >= 0)
        {
            inputTextBox.Clear();
            pictureBox4.Visible = true;
            intNumberLots--;
            label9.Text = intNumberLots.ToString();

        }
    }

Тогда для кода, который обновляется, если нет автомобиляв лот;

        else if (string.str != "0x57" && intNumberLots >= 3)
        {
            inputTextBox.Clear();
            pictureBox1.Visible = false;
            intNumberLots++;
            label9.Text = intNumberLots.ToString();

        }

        else if (string.str != "0x58" && intNumberLots >= 3)
        {
            inputTextBox.Clear();
            pictureBox2.Visible = false;
            intNumberLots++;
            label9.Text = intNumberLots.ToString();

        }

        else if (string.str != "0x59" && intNumberLots >= 3)
        {
            inputTextBox.Clear();
            pictureBox3.Visible = false;
            intNumberLots++;
            label9.Text = intNumberLots.ToString();

        }

        else if (string.str != "0x5A" && intNumberLots >= 3)
        {
            inputTextBox.Clear();
            pictureBox4.Visible = false;
            intNumberLots++;
            label9.Text = intNumberLots.ToString();

        }

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Каждый вызов serialPort.ReadLine будет блокироваться, пока не поступит следующая строка.

Вам нужно serialPort.ReadLine один раз в верхней части цикла перевести в переменную и проверить это.

While(){

    message = serialPort.ReadLine();

    if (message == "0x57" && intNumberLots >= 0)     //  if data received is "1", do tasks below
    {
        ...etc.

Кроме того, действительно ли данные представляют собой строку, содержащую символы "0x5A" и т. Д., Или каждый символ '0x5A'?

Я заметил, что ваш пример не является реальным кодом - (While вместо while, serialPort.ReadLine вместо serialPort.ReadLine(), string.str, например). Пожалуйста, попробуйте опубликовать пример кода, который мы можем помочь вам исправить - слишком много проблем с этим, чтобы определить вашу истинную проблему (особенно если вы не сказали, в чем проблема!)

0 голосов
/ 29 сентября 2011

Я вижу, вы подключили обработчик событий, принятый данными, для последовательного порта.Если так, то почему вы не используете его?Событие запускается всякий раз, когда данные поступают через последовательный порт, что лучше, чем бесцельный опрос последовательного порта на предмет данных, которые являются лишь пустой тратой ресурсов.

public void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
      var datareceived = serialport.ReadLine()
      // Do data processing here

      // Invoke delegate using dispatcher to update UI

}
...