Cách của MMCK rất chi là chính xác, mình cũng đã làm rồi, sẵn tiện nói chi tiết cho bạn luôn
Cách mình đã làm nhé:
Trên C#, gửi chuỗi kp@Ki@Kd@Tin_hieu_dat@ xuống vi điều khiển. Bạn dùng ngắt uart nhận chuỗi này vào một cái mảng kiểu char. Bạn thấy mình có chèn kí tự @ trong chuỗi đấy, mục đích là để mình biết đâu là kp, ki, kd và tín hiệu đặt. Sau đó ở dưới VDK, bạn cứ tách ra và chuyển string thành float là đem đi sài cho hàm pid được rồi.
Đây là code dùng để tách kp,ki,kd, tín hiệu đặt (trong code mình dùng kí tự "e" thay cho "@")
Code:
void ReadUart(void)
{
unsigned int dem = 0, count_e = 0;
char temp_uart[6];
for(int i=0;ReceiveData[i] != '/';i++)
{
if(ReceiveData[i]=='e')
{
count_e++;
switch(count_e)
{
case 1:
{
for(int j = 0;j<=i;j++) temp_uart[j] = ReceiveData[j];
Tset = String2Num(temp_uart);
dem = i+1;// chi so cua ky tu sau e
break;
}
case 2:
{
for(int j = dem;j<=i;j++)temp_uart[j-dem] = ReceiveData[j];
Kp = String2Num(temp_uart);
dem = i+1;
break;
}
case 3:
{
for(int j = dem;j<=i;j++)temp_uart[j-dem] = ReceiveData[j];
Ki = String2Num(temp_uart);
dem = i+1;
break;
}
case 4:
{
for(int j = dem;j<=i;j++)temp_uart[j-dem] = ReceiveData[j];
Kd = String2Num(temp_uart);
count_e = 0;
break;
}
}
}
}
}
Đây là code chuyển từ string sang số thực
Code:
double String2Num(char *str)
{
double x = 0;
double powel;
unsigned char count = 0 , dot_position = 0;
unsigned char i;
unsigned char buf[20];
unsigned char *ptemp;
ptemp = buf; //con tro den buffer
while( *str != 'e')
{
*ptemp = *str - 0x30;
if( *str == '.') dot_position = count;
ptemp++;
str++;
count++;
}
if( dot_position == 0) dot_position = count; //so nguyen hoan toan
//tinh tong phan nguyen
powel = 1;
for(i = 1 ; i <= dot_position ; i++)
{
x += buf[dot_position-i]*powel;
powel *= 10;
}
//tinh tong phan thap phan
powel = 0.1;
for( i = dot_position + 1 ; i < count ; i++)
{
x += buf[i]*powel;
powel *= 0.1;
}
return x;
}