PDAclub.pl - Forum użytkowników technologii mobilnych
Windows Mobile (Classic, Professional, Standard), Windows Phone 6.x oraz 7/8.x/10 => Oprogramowanie PPC => Dla programistów => Wątek zaczęty przez: omcdr w Sierpień 27, 2008, 15:44:37
-
Moje pytanie dotyczy obsługi portu COM w C#. Po połączeniu z bluetooth SPP pojawia się wirtualny port COM7.
Mogę wysłać i odebrać dane, ale nie równocześnie, jeśli w programie jest wątek, który nasłuchuje na tym porcie, to nie mogę nic wysłać. Jeśli tego wątka nie ma to mogę wysłać, ale nie mam jak odebrać.
Można te dwie funkcje zmusić do współdziałania, aby można było wysyłać i odbierać dane ?
Ewentualnie jak inaczej sprawdzać, czy jest coś do odebrania na tym porcie COM ?
private string Port = "COM7";
private void mnuConnect_Click(object sender, EventArgs e)
{
serial = new SerialPort(Port);
serial.ReadTimeout = 1000;
try
{
if (!serial.IsOpen)
{
textBox1.Text += "Output port closed. Opening output port...\r\n";
serial.Open();
}
textBox1.Text += "Ports opened. Starting the listener thread...\r\n";
rcvThread = new Thread(new ThreadStart(ReceiveData));
numThreads++;
rcvThread.Start();
textBox1.Text += "Listener thread started.";
btnSend.Enabled = true;
textBox1.Text += "Connected.\r\nInbound:" + inboundPort + "\r\nOutbound:" + outboundPort+"\r\n";
}
catch (Exception ex)
{
...
}
}
private void ReceiveData()
{
while (!closeRequested && !disconnectRequested)
{
try
{
string line = serial.ReadLine();
if (line.CompareTo("quit$$$") == 0)
{
disconnectRequested = true;
continue;
}
txtLog.Invoke(new updateText(UpdateText), line);
}
catch
{
}
}
}
private void btnSend_Click(object sender, EventArgs e)
{
try
{
serial.WriteLine(" tttteeeeeeexxxxxxxtttt\n");
}
catch (Exception ex)
{
}
}
-
Musisz wstrzymac odczyt portu na czas wysylania.
Jest na to wiele sposobow.
Albo uzyc mechanizmu WaitForCommEvent (z Win32 API - nie wiem jak sie nazywa odpowiednik w .NET).
-
Witam
Nie ma takiej potrzeby, żeby tworzyć specjalny dodatkowy wątek do odbioru ... tym bardziej, że nie spełnia swojego zadania.
Klasa SerialPort posiada zdarzenie DataReceived do odbioru danych:
- odbiór jest asynchroniczy i wywoływany tylko wtedy jeśli coś znajdzie się w buforze odbiorczym
- nie ma pullingu więc nie ma obciążenia procesora.
Najwygodniej jest to wyklikać ;) ("położyć" SerialPort i wyklikać zdarzenie), ale jeśli trzeba to napisać:
Definicja zdarzenia:
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
}
Oraz podpięcie tego zdarzenia do klasy:
this.serialPort.DataReceived += new SerialDataReceivedEventHandler(this.serialPort_DataReceived);