Witam
mam dziwny problem z tym komponentem. Piszę program do komunikacji z moim układem elektronicznym, który bazuje na kontrolerze ATxmega.
Na potrzeby testów komunikacji zainstalowałem sobie wirtualne com porty, które są "sparowane ze sobą" ( przykładowo com 3 i 4)gdy wysyłam cos poprzez com 3 to trafia to do com 4 i odwrotnie. Napisałem 2 aplikacje, jedna ma emulować mój układ ( na czas napisania kompletnie działającego programu) a drugi program ma by docelową aplikacją.
Główna aplikacja na początku, sprawdza ile mam w komputerze portów COM i wpisuje na listę combobox wszystkie nie używane com porty.
porty sprawdzam w ten sposób:
private void Form1_Load(object sender, EventArgs e)
{
int a = 0;
foreach (string portName in System.IO.Ports.SerialPort.GetPortNames())
{
Interface.PortName = portName;
try
{
Interface.Open();
if (Interface.IsOpen)
{
PortNr.Items.Add(portName);
Interface.Close();
a = a + 1;
}
}
catch { }
}
if (a > 0)
{
Port.Enabled = true;
PortNr.SelectedIndex = 0;
}
else
{
Port.Enabled = false;
PortNr.Enabled = false;
ViewLog.SelectedText = "Brak portów komunikacyjnych do połączenia się z urządzeniem.\nSprawdź zasilanie urządzenia i podłącz urządzenie do komputera za pośrednictwem portu USB.\n";
}
Timer.Enabled = false;
}
Następnie otwieram com port pobrany z listy combobox i wysylam stringa - robię to tak:
Inteface.PortName = PortNr.Text;
Interface.Open();
Interface.WriteLine("Connect-Ctrl");
ViewLog.SelectedText = "Open Port: " + Interface.PortName + "\n";
Jaki mam problem - Otóż nie mogę instrukcją "Interface.WriteLine" wysłać więcej niż 12 bajtów :( gdy dam dłuższy ciąg znaków to program wisi i nie ma to znaczenia czy jeden string będzie miał długość więcej niż 12 bajtów czy zrobię 2 osobne linie "Interface.WriteLine" , które będą wysyłały 2 ciągi string przykładowo po 10 znaków.
Krótko mówiąc po wysłaniu 12 bajtów więcej nie mogę nic wysłać, chyba, że zamknę i otworze ponownie port :(
natomiast drugim programie , który oczekuje na swoim com porcie string ("Connect-Ctrl"); w obsłudze zdarzenia "Interface_DataReceived" odbieram ten ciąg i w odpowiedzi wykonuję linię:
private void Interface_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
ViewLog.SelectedText = Interface.ReadLine();
Interface.WriteLine ("Sound Interface Device V2.0 - Firmware 1.1B - Autor Janusz .....");
}
Jak widać mogę wysłać dowolnie długiego stringa i program mi się nie zawiesza, więc trudno mi powiedzieć dlaczego pierwszy program się wiesza :(
dodam, ze pierwszy program wysyła i odbiera dane z com portu w innym wątku który jest generowany przez komponent Timer, ale czy to może być problem ?