roboforum.ruТехнический форум по робототехнике. |
|
|
interrupt [USART1_RXC] void usart1_rx_isr(void)
{
rx_buffer[rx_wr_index++]=UDR1;
if (rx_wr_index == RX_BUFFER_SIZE){rx_wr_index=0;}
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
}
}
unsigned char rx_read (void)
{
unsigned char data;
while(rx_counter==0);
data=rx_buffer[rx_rd_index++];
if (rx_rd_index == RX_BUFFER_SIZE) {rx_rd_index=0;}
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
void main (void){
while (1)
{
switch (rx_read())
{
case SYNCHRONIZATION: //0
rx_counter=0;
break;
case RADAR: //1
radar(rx_read());
break;
case SENSOR: //2
tx_write(SENSOR);
tx_write(sensor());
break;
case ROBOMD2: //3
robomd2(rx_read(),rx_read());
tx_write(ROBOMD2);
break;
case SERVO: //4
servo(rx_read(),rx_read());
tx_write(SERVO);
break;
case ADC_FUNCT: //5
start_adc(rx_read());
tx_write(ADC_FUNCT);
tx_write(read_adc());
break;
default:
tx_write(0);
tx_write(0); //
tx_write(0);
}
}}
DWORD WINAPI MyroboThread(LPVOID)
{
unsigned char ask;
unsigned char funct, param1, param2;
while(1)
{
switch (next_funct) //функции отправки данных на мк
{
case 1:
sharp_redi=0;
radar_write();
break;
case 2:
calc();
break;
case 3:
speed();
break;
}
if(read_byte) //если надо что принять
{
switch (read_rx()) //функции чтения данных с мк
{
case 1:
param1=read_rx();
param2=read_rx();
radar_read(param1,param2);
break;
case 2:
break;
case 3:
break;
case 4:
break;
default:
ShowMessage("Error read");
break;
}
}
}
}
unsigned char read_rx (void)
{
unsigned char data;
while(rx_counter==0){};
data=bufrd[rx_index++];
--rx_counter;
if (rx_counter==0)
{
rx_index=0;
memset(bufrd, 0, BUFSIZE);
}
return data;
}
void write_tx (unsigned char data)
{
bufwr[tx_index++]=data;
++tx_counter;
}
DWORD WINAPI ReadThread(LPVOID)
{
COMSTAT comstat; //структура текущего состояния порта, в данной программе используется для определения количества принятых в порт байтов
DWORD btr, temp, mask, signal; //переменная temp используется в качестве заглушки
overlapped.hEvent = CreateEvent(NULL, true, true, NULL); //создать сигнальный объект-событие для асинхронных операций
SetCommMask(COMport, EV_RXCHAR); //установить маску на срабатывание по событию приёма байта в порт
while(1) //пока поток не будет прерван, выполняем цикл
{
WaitCommEvent(COMport, &mask, &overlapped); //ожидать события приёма байта (это и есть перекрываемая операция)
signal = WaitForSingleObject(overlapped.hEvent, INFINITE); //приостановить поток до прихода байта
if(signal == WAIT_OBJECT_0) //если событие прихода байта произошло
{
if(GetOverlappedResult(COMport, &overlapped, &temp, true)) //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent
if((mask & EV_RXCHAR)!=0) //если произошло именно событие прихода байта
{
ClearCommError(COMport, &temp, &comstat); //нужно заполнить структуру COMSTAT
btr = comstat.cbInQue; //и получить из неё количество принятых байтов
if(btr) //если действительно есть байты для чтения
{
ReadFile(COMport, bufrd, btr, &temp, &overlapped);
rx_counter+=btr;
}
}
}
}
}
DWORD WINAPI WriteThread(LPVOID)
{
DWORD temp, signal; //temp - переменная-заглушка
overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL);
while(1)
{
WriteFile(COMport, bufwr, tx_counter, &temp, &overlappedwr);
signal = WaitForSingleObject(overlappedwr.hEvent, INFINITE);
tx_counter=0;
tx_index=0;
if((signal == WAIT_OBJECT_0) && (GetOverlappedResult(COMport, &overlappedwr, &temp, true)))
{
Form1->StatusBar1->Panels->Items[0]->Text = "Transmission was successful";
}
else {Form1->StatusBar1->Panels->Items[0]->Text = "Error transmit";}
SuspendThread(writer);
}
}
char ribbon_segment[8];
char *ribbon = " N NE E SE S SW W NW N ";
azimuth= get_heading(&a_avg, &m_avg, &p);
strncpy(ribbon_segment, &ribbon[(azimuth + 5) / 10], 8);
Form1->StatusBar1->SimpleText=ribbon_segment+IntToStr(azimuth);
string st1 = (" N NE E SE S SW W NW N ");
string st2;
azimuth= get_heading(&a_avg, &m_avg, &p);
size_t x=(azimuth + 5) / 10; //здесь 2 ошибки
st1.copy(st2,x,8);
Form1->StatusBar1->SimpleText=st2; //здесь требует AnsiString
Вернуться в Компьютеры в роботостроении
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10