QUOTE (Yurickk @ Dec 26 2010, 01:32)

Секунд пять пауза, а затем уже: Bad responce!
Такое впечатление, что не определяется версия SAM-BA Boot.
У меня на контроллере написана В, хотя продали мне его как 001.
Хотя, как Вы писали, это не имеет значения...
Остаётся попробовать на другом компьютере....
Да, думаю нужно попробовать.
Могу открыть код в плане чтения версии встроенного загрузчика SAM-BA. Тут в принципе все просто. Стринг загрузчика должен заканчиваться символами 0x0A, 0x0D. Программа читает строку из устройства параллельно проверяя символы на последовательность окончания строки и проверяя количество считанных данных дабы не переполнился буфер строки - размер 256 байт (не думаю, что строка версии загрузчика больше этой цифры).
Если программа считает 256 байт данных и не встретит символы 0x0A, 0x0D или в течении 5 секунд не придет очередной символ она завершится с ошибкой "Bad responce"
Вот код:
Основной процесс:
CODE
try /* Starting */
{
...
printf("- CPU boot version: ");
VALIDATE_EXC(cmdVersion(g_Buf, CFG_DATA_BUF_SIZE));
printf("%s\r\n", g_Buf);
...
}
catch(...)
{
ShowResult(res);
goto exit;
}
Чтение стринга версии загрузчика МК
CODE
IO_RES cmdVersion(PCHAR rval, ULONG rlen)
{
UCHAR buf[2];
PCHAR p;
IO_RES res;
ULONG i = 0;
buf[0] = 'V'; /* Send initialize command */
buf[1] = '#';
/* Send request */
res = WriteData(buf, 2);
if(res)
return res;
/* Read version string */
p = rval;
while(1)
{
res = ReadData(p, 1);
if(RES_OK != res)
break;
if(*p == 0x0A) /* Check end of string */
break;
p++;
i++;
if(i >= rlen - 2) /* Responce too big */
{
res = RESP_TO_BIG;
break;
}
}
/* Get last control */
if(RES_OK == res && i > 0)
{
p++;
res = ReadData(p, 1);
if(RES_OK == res)
{
if(*p != 0x0D)
res = RESP_BAD;
else
rval[i] = 0; /* End of string */
}
}
else
res = RESP_BAD;
return res;
}
Низкоуровневое чтение-запись СОМ-порта.
CODE
/*******************************************************************************
Write data to device
*******************************************************************************/
IO_RES WriteData(PVOID Data, ULONG Size)
{
OVERLAPPED sync = {0, 0, 0, 0, 0};
ULONG xfer, err;
IO_RES res = RES_OK;
sync.hEvent = CreateEvent(0, FALSE, FALSE, NULL);
if(!WriteFile(g_hPipe, Data, Size, &xfer, &sync))
{
/* Check error */
err = GetLastError();
if(ERROR_IO_PENDING == err)
{
/* Pending write operation */
if(WAIT_OBJECT_0 != WaitForSingleObject(sync.hEvent, CFG_IO_TIMEOUT))
res = WRITE_TIMEOUT;
}
else
res = WR_FAIL;
}
CloseHandle(sync.hEvent);
return res;
}
/*******************************************************************************
Read data from device
*******************************************************************************/
IO_RES ReadData(PVOID Data, ULONG Size)
{
OVERLAPPED sync = {0, 0, 0, 0, 0};
ULONG xfer, err;
IO_RES res = RES_OK;
sync.hEvent = CreateEvent(0, FALSE, FALSE, NULL);
if(!ReadFile(g_hPipe, Data, Size, &xfer, &sync))
{
/* Check error */
err = GetLastError();
if(ERROR_IO_PENDING == err)
{
/* Pending write operation */
err = WaitForSingleObject(sync.hEvent, CFG_IO_TIMEOUT);
switch(err)
{
case WAIT_OBJECT_0:
break;
case WAIT_ABANDONED:
res = RD_FAIL;
case WAIT_TIMEOUT:
default:
res = READ_TIMEOUT;
}
}
else
res = RD_FAIL;
}
CloseHandle(sync.hEvent);
return res;
}