Bilgisayardan usart ile veri gönderebiliyorum fakat alma da problem var.Önce sadece 1 karakter alıp değerlendireceğim.Şöyle bir deneme yaptım.
Bağlantı
SP.BaudRate = Convert.ToInt32(cmbBaud.SelectedItem);
SP.PortName = Convert.ToString(cmbPort.SelectedItem);
SP.DataBits = 8;
SP.Parity = Parity.None;
SP.StopBits = StopBits.One;
SP.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
SP.Open();
Kesme
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] RxData = new byte[1];
SP.Read(RxData, 0, 1);
txtDataRx.AppendText(Convert.ToString(RxData[0]));
}
STM32
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
if((char)USART_ReceiveData(USART1) == '1')
{
LED_Blue_State = 1;
USART_SendData(USART1, 'A');
}
if((char)USART_ReceiveData(USART1) == '0')
{
LED_Blue_State = 0;
USART_SendData(USART1, 'B');
}
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
STM ile veri gönderdim anda PC arayüz kilitleniyor ve şu hatayı gösteriyor.
"Additional information: Çapraz iş parçacığı işlemi geçerli değil: 'txtDataRx' denetimine oluşturulduğu iş parçacığı dışında başka bir iş parçacığından erişildi."
Baran, ne zaman kesme içinde işlem yapmaktan vazgeçeceğini söyler misin?
Hocam denemek için öyle yaptım. :)
Bu işi ben de bir türlü beceremedim. Göndermeyi yaptım ama almada hep sıkıntı yaşadım, çok da üzerinde durmadım. Alma işini farklı bir thread içerisinde yapmaktan bahsediliyordu ama net bir bilgim yok. istersen bir araştır.
Bilgisayarda mı alamıyorsun, MCU'dan mı?
bilgisayardan alamıyorum, kilitleniyor daha doğrusu baranınki gibi. geçiştirdim hep işimi gördüm ama halledemedim bir türlü.
MCU dan alamıyorum hocam C#tarafında problem var galiba
Kardeş serial port komponenti başta sp adını vermişsin ama kesme de serialPort olarak adlandırılmış. Onu bi kontrol et.
Hem bilgisayardan almak için hem de stm'den almak için bir örnek paylaşırım bu gece bi aksilik olmazsa.
Alıntı yapılan: Hadi - 09 Haziran 2015, 22:59:37
Kardeş serial port komponenti başta sp adını vermişsin ama kesme de serialPort olarak adlandırılmış. Onu bi kontrol et.
O kesme methodunun adı :)
Alıntı yapılan: Baran Ekrem - 09 Haziran 2015, 23:27:27
O kesme methodunun adı :)
Tamam da sp adlı komponentin kesmesi ama. Sen bi böyle yap bi dene baktın değişen bisey yok geri düzelt.
private void SP_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] RxData = new byte[1];
SP.Read(RxData, 0, 1);
txtDataRx.AppendText(Convert.ToString(RxData[0]));
}
CheckForIllegalCrossThreadCalls = false
public MainForm()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
Ekleyerek oldu.Teşekkür ederim.Ne işe yarıyor onu öğrenmek gerek.USB HIDde de vardı aynı kod.
threadlar arasında çapraz çalışmaya izin veriyor, daha önce forumda bahsi geçmişti.
PC ye şöyle string atabiliriz.Denedim.
/***********************************************************
* Function Name : USART_SendString
* Description : USART dan string yollanır.
* Input : USARTx, char*
* Return : void
***********************************************************/
void USART_SendString(USART_TypeDef* USARTx, char* USART_Data)
{
while(*USART_Data)
{
while(!USART_GetFlagStatus(USARTx, USART_FLAG_TXE));
USART_SendData(USARTx, *USART_Data);
USART_Data++;
}
}
//mesela
USART_SendString(USART1, "LED On\r\n");
C# da
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string RxData;
RxData = SP.ReadLine() + "\r\n";
txtDataRx.AppendText(RxData);
}
stm32 için bir örnek
unsigned char aldik=0;
unsigned int rxSayac=0;
volatile unsigned char RxTampon[100];
void USART1_IRQHandler(uint8_t c){
RxTampon[rxSayac]=USART1->DR;
rxSayac++;
if(RxTampon[rxSayac-1]=='\r' && RxTampon[rxSayac]=='\n') {
rxSayac=0;
aldik=1;
}
}
void main(void){
while(1){
if(aldik) {
rxSayac=0;
aldik=0;
USART_SendString(USART1,&RxTampon[0]); //gelen veriyi geri gönder
}
}
}
geldim, ;)
çapraz iş falan filan demesinin sebebi ; (cross-thread operation not valid)
seriportu dinlerken başka işlemlerde yapması gerekir tabi biz bunu anlatmadığımızdan bu hatayı alırsınız.
Arayınca bu yazıyı buldum http://www.serkanayaz.com/kategoriler/programlama/cross-thread-operation-not-valid-hatasi/ (http://www.serkanayaz.com/kategoriler/programlama/cross-thread-operation-not-valid-hatasi/)
ama bu uygun bir yöntem değildir. invoke ve delegate ile ilgili çalışma yapılması gerekir.
http://blog.ahmetbutun.net/index.php/2009/04/07/cross-thread-operation-not-valid/ (http://blog.ahmetbutun.net/index.php/2009/04/07/cross-thread-operation-not-valid/)
aha oda burada.
Evet bende delegate ile yaptım.
Teşekkürler Gökhan hocam :)
Bahsettiğiniz yöntem ile bir örnek yazarsanız istifade ederiz.
Şu an kullandığım örnek de şöyle yaptım.
internal delegate void SerialDataReceivedEventHandlerDelegate(object sender, SerialDataReceivedEventArgs e);
delegate void SetTextCallback(string text);
string InputData = String.Empty;
SerialPort SP = new SerialPort();
//yukarısı global
private void SetText(string text)
{
this.txtDataRx.AppendText(text);
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (SP.IsOpen)
{
InputData = SP.ReadExisting();
if (InputData != String.Empty)
this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });
}
else
MessageBox.Show("", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
Hocam usarttan gelenleri alıp daha sonra bir string ile nasıl karşılaştırabilirim ? C deki string işini bir türlü anlamadım.Diziye alma veya pointer ile yapılıyor sanırım .
@Baran
"Usarttan aldığım", bu alım işlemi PC demi MCU damı
Pc den gönderdiğim stringi mcu ile alıp mcu içerisinde sabit bir string ile karşılaştırmak istiyorum hocam.
stringi karşılaştırmak demek iki adet dizinin birebir aynı olup olmadığına bakmak demek. Yani bir döngü kuracaksın, enter karakterini görene kadar devam edecek ama her adımda iki dizi ilemanını if ile karşılaştıracaksın, eğer farklı ise return false; diyeceksin, enter'a kadar return yapmadan ulaşabildiyse return true'yi hakediyor demektir. Çok basit anlayacağın.
mesaj birleştirme:: 10 Haziran 2015, 23:28:13
char katarKarsilastir(char *katar1, char *katar2)
{
while(*katar1!=0){
if (*katar1 != *katar2) {
return (0);
}
katar1++;
katar2++;
}
return (1);
}
Üzerinde biraz daha oynanması lazım.
Str1='1234',0
Str2='12345',0
Birbirine eşit değildir.
standard C library icinde soyle yazilmis:
int strcmp(const char* s1, const char* s2)
{
while(*s1 && (*s1==*s2))
s1++,s2++;
return *(const unsigned char*)s1-*(const unsigned char*)s2;
}