serial port zamanlama problemi

Başlatan armsistem, 06 Ocak 2013, 21:03:53

armsistem

Arkadaşlar merhaba ;

-Sim300 ile c#.net uart haberleştiriyorum. Daha önceki projelerimde kullandığım bir kod parçası var (aşağıda) , veri gönderiyorum arkasından okuyorum .Problem yok.

     # region send_comport
        string send_comport (string cmpt,string command__1)
         {   
           string s1;
             comm.PortName = cmpt;
              comm.BaudRate = 19200; //standart baudrate değişmiyor
               comm.DataBits = 8;
                comm.Parity = 0;
                 comm.Open();
                  comm.Write(command__1);
                   s1 = comm.ReadExisting();   //  s1 = comm.ReadLine(); şeklinde yaparsam kilitkeniyor.
                    comm.Close();
                     return s1;
                      }
                      # endregion


Diyelim ki 'AT' komutu gönderiyorum bana 'OK' olarak dönmesi gerekiyor ve dönüyorda burada problem yok.

-AT \r\n ---->send
-AT \r\n ---->receive
-OK \r\n---->receive


Fakat bazı komutlarda veri gönderdikten 2-3 saniye sonra size cevap veriyor.

-AT+CGATT=1\r\n----->send
//0,5 sn bekliyor
-AT+CGATT=1\r\n----->receive
//2-3 sn bekliyor.
-OK\r\n ----------------->receive


Buda sıkıntı oluyor çünkü gelen veriyi istediğim gibi yakalayamıyorum. Sürekli seri porttan okuma yapmak veya mikroişlemcilerdeki gibi kesme oluşturma yada nedir bu işin mantığı.

- Diğer sıkıntım ise " tırnak simgesini gönderemiyorum \ işareti ile oluşturdum doğru gibi geliyor ama yolladım yine de sıkıntı oldu.
public static string     tirnak = " \" ";
MessageBox.Show("AT+CDNSCFG=" +tirnak +"208.67.222.222" +tirnak+","+tirnak + "208.67.220.220"+tirnak +(Char )13);
//                              AT+CDNSCFG="208.67.222.222","208.67.220.220"<CR>   


Bende hex olarak gönderiyorum işinize yarayabilir kod aşağıda. Niye string gönderemiyorum hex gönderebiliyorum birebir herşeyi aynı.

public string ConvertHexToString(string HexValue)
{
string StrValue = "" ;
while (HexValue.Length > 0)
{
StrValue += System.Convert.ToChar(System. Convert.ToUInt32(HexValue.Substring(0, 2), 16)).ToString();
HexValue = HexValue.Substring(2, HexValue.Length - 2);
}
return StrValue;
}


     string e = (ConvertHexToString("41" + "54"+ "2B"+ "43" + "53"+ "54" + "54"+ "3D"+ "22" + "69"+ "6E"+ "74" + "65"+ "72"+ "6E" + "65"+ "74"+ "22"+ "2C" + "22"+ "67"+ "70" + "72"+ "73"+ "22" + "2C"+ "22"+ "67" + "70"+ "72"+ "73"+ "22" + "0D"));
dump = send_comport(COM4, e);

// string e =AT+CDNSCFG="208.67.222.222","208.67.220.220"<CR> 

muhittin_kaplan

Hocam olayın üzerindesiniz, yani bilgisayar, yazdığınız programın başka işlerini yaparken bu arada Seriportu da dinleyebilmeli ve datarecieve olayını tetikleyebilmeli.
Bunun için delegate ve tread olaylarını incelemelisiniz.

Ben C# a pek hakim değilim
şurada örneği verilmiş
http://msmvps.com/blogs/coad/archive/2005/03/23/SerialPort-_2800_RS_2D00_232-Serial-COM-Port_2900_-in-C_2300_-.NET.aspx

JOKERAS

Selam,
Bu sorunu bende bulamadım, amatörce bir kaç C# denemelerimde seriporttan string datayı sorunsuz gönderdim ama ne zamanki seri portu okumak istedim kitlenip kalıyor.
Dedimki acaba almak istediğim datamı problem var onu test etmek için gönderdiğimi eko yaparkta test ettim sonuç hüsran.
İnternette bir yerde bir yazı okumuştum deneme fırsatım olmadı,seri port'u readline yaptığımz anda bir timer kurmak gerekiyormuş bu timer ile gelecek olan datanın ne kadar zaman sonra geleceğini falan biliyormuş eğer yazdığımız program bu zamanı bilmiyorsa gelene kadar bekliyormuş falan.
Onun için bu readline dediğimizde bunun timerini kurmak gerekiyormuş bir bakın test edin isterseniz.

ULAGA

Aşağıdaki yazdığım küçük program hem veri gönderme işlemini hem de veri alma işlemini sağlıklı bir şekilde gerçekleştiriyor.

http://yadi.sk/d/j0gzIpbD1iuai