Цитата(aaarrr @ Oct 28 2009, 02:27)

Ну, если действительно все так просто - одна команда и работа в режиме отравил-принял .....
Ну там чуть-чуть по другому.. В пакете несколько интеджеров каждый для разных штук и какбы одновременно можно например половине посылать данные а половине команды(признак команды - старший бит 1, еще несколько бит номер, остальные -параметры..) Ну это не важно счас)
Заметил что при считывании в виндусе пакета физически приходит-то все, но отдается иногда(редко) частями.
Т.е. может прийти 1 байт а за ним все остальные..(при размере конечной точки 64 байта и размере передачи, скажем, 40 байт) Решилось примерно так, хотя непонятные вещи таки остались..
Код
while (ComPortReceivedBytesCnt != ComPortReadLength)
{
if ((ComPortReadLength - ComPortReceivedBytesCnt) > 0)
ComPortReceivedBytesCnt += DevComPort.Read(buf, ComPortReceivedBytesCnt, ComPortReadLength - ComPortReceivedBytesCnt);
else
{
Form1.log_file.Write("Ошибка синхронизации: получено больше данных чем запрашивалось! Порт " + dev_guid, this.ShortName, Form1.log_pShowMsg, Form1.log_pWriteLog);
return RWResult.SyncError;
}
}
И чтоб не плодить темы, хочу поинтересоваться насчет spurious прерывания. Никак не могу избавиться,
очень часто возникает (при некотором правильном подборе количества строчек кода в определенныъ местах)) ) - раз в пару секунд или даже чаще. Варианты и комбинации пробовал разные, не помогает.. Или такая частота возникновения - это нормально? Код:
Код
void disable_stepper_interrupt()
{
*AT91C_TC2_CCR = AT91C_TC_CLKDIS; // Channel Control Register
*AT91C_TC2_IDR = AT91C_TC_CPCS;
*AT91C_AIC_IDCR = (1<<AT91C_ID_TC2);
*AT91C_AIC_ICCR = (1<<AT91C_ID_TC2); // Interrupt Clear Command Register
}
Комбинации строк пробовал почти все ) Понятно что TC_IDR и CLKDIS лишнее, но другие варианты у меня закончились, пробовал что попало)) И как попытаться (и стоит ли) сделать вызовы пореже?