2013-07-22 3 views
0

Я использую CMS-последовательный порт, управляющий gsm-модемом. В настоящее время в Mikroelectronia USART терминал после отправки:Последовательный порт не получает все данные в C#

AT + CUSD = 1, "* 778 #", 15

Он получает:

AT + CUSD = 1,» * 778 # "15

OK

+ CUSD: 0," Баланс: 0,00 Т.К. Срок действия:. 29-июля-13 Bonus:.. 0.00TK Free Min: 0. Наберите * 121 * 2092 # 3 хит песни Ashiqui-2 как ур Caller Tunetk.10" , 64

Но в C# после отправки данных

AT + CUSD = 1, "* 778 #", 15

возвращается:

AT + CUSD = 1, "* 778 #", 15

ОК

+ CUSD: 0, "Balance: 0.00 TK. Срок действия: 29-июл-13. Бонус: 0.00TK. Бесплатно Минимальный: 0. Наберите * 121 * 2092 # для 3 хитовых песен Ashiqui-2 как ur Caller Tune

Это означает, что в C# он не получает никаких данных после «Caller Tune». Почему это происходит? Часть C# код Я использовал это

 private void Form1_Load(object sender, EventArgs e) 
     { 
      sp1.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); 
     } 

     void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      var valueOfPort = sp1.ReadExisting(); 
      textBox1.AppendText(valueOfPort); 

     } 
private void button1_Click(object sender, EventArgs e) 
     { 
      TextBox.CheckForIllegalCrossThreadCalls = false; 

      try 
      { 


       if (!sp1.IsOpen) 
       { 
        sp1.Open(); 
       } 
       sp1.Write(textBox2.Text+"\r"); 

      } 
      catch(Exception ex) 
      { 

       MessageBox.Show(string.Format("Exception : {0}", ex.Message), "Port Error"); 
      } 
     } 

ответ

3

TextBox.CheckForIllegalCrossThreadCalls = false; делает меня очень подозрительно, я думаю, что это то, что нарушает вашу программу, просто просто вызвать, чтобы обновить текстовое поле правильно, и я думаю, что он будет работать. Просто измените код события на следующее:

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    if(textbox1.InvokeRequired) 
    { 
     textbox1.Invoke(new SerialDataReceivedEventHandler(sp_DataReceived), sender, e); 
    } 
    else 
    { 
     var valueOfPort = sp1.ReadExisting(); 
     textBox1.AppendText(valueOfPort); 
    } 
} 

Что это будет сделать, это проверить, если вы работаете на правильном потоке, если не он снова перезагружается функцию в потоке пользовательского интерфейса с теми же аргументами. Кроме того, обязательно удалить TextBox.CheckForIllegalCrossThreadCalls = false;


UPDATE: После повторного прочтения MSDN я нашел this remark

Этот метод возвращает содержимое потока и внутреннего буфера объекта SerialPort в виде строка. Этот метод не использует тайм-аут. Обратите внимание, что этот метод может оставлять задние байты во внутреннем буфере, что делает значение BytesToRead больше нуля.

Попытайтесь проверить, есть ли больше данных для чтения после звонка ReadExisting.

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    if(textbox1.InvokeRequired) 
    { 
     textbox1.Invoke(new SerialDataReceivedEventHandler(sp_DataReceived), sender, e); 
    } 
    else 
    { 
     while(sp1.BytesToRead > 0) 
     { 
      var valueOfPort = sp1.ReadExisting(); 
      textBox1.AppendText(valueOfPort); 
     } 
    } 
} 
+0

TextBox.CheckForIllegalCrossThreadCalls = false; не создает никаких проблем .... Я проверил его, удалив его ... – rakib

+1

Возможно, имеется больше доступных данных, см. Мое обновление. –

1

Вы определили EOL своего устройства и правильно настроили его в своей программе? Последовательный порт C# не обязательно запускает DataReceive в начале сообщения и не знает, где заканчивается сообщение. Он может прерываться в любом месте сообщения. Вы должны попробовать явно установить EOL, который может быть уникальным образом идентифицирован порта, чтобы он мог буферизовать входящее сообщение и вернуть его после его завершения.

// e.g. I normally used (carriage return + newline) instead of just either one 
sp1.NewLine = "\r\n"; 
+0

Не повезло с использованием > sp1.NewLine = "\ r \ n"; код – rakib

+0

\ r \ n является лишь примером. У меня когда-то было оборудование, которое по умолчанию использовало \ n для разных сообщений, которые создают проблемы, потому что сам контент сообщения также содержит другие \ n. (Изображение, если Caller Tunetk.10 ", 64 на самом деле Caller Tune \ ntk.10", 64, EOL не будет работать должным образом). Затем я настроил аппаратное обеспечение для использования \ r \ n как своего EOL, потому что вряд ли это будет в содержимом сообщения. Вы должны настроить свое оборудование перед установкой того же EOL в своей программе. – KMC

+0

Я думаю, что выяснил проблему .... Я проанализировал полученные данные в шестнадцатеричном значении, и я увидел, что после «Caller Tune» он отправляет значение 0x00 в hex.thank за ваше время – rakib

Смежные вопросы