Проблема при передаче через Com-порт

  • Автор темы ShlakBaum
  • Дата начала
S

ShlakBaum

#1
Пишу программу, которая стартует при загрузке BIOS (ROM), производит вычисления и выдает результат в com-порт. Основной код написан на c++. Его я присоединяю к коду на ассемблере:
[codebox] CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
org 100h

mybegin:
db 055h, 0AAh ; Сигнатура
db 0ch ; размер блока в 200h байтовых секторах
; данный размер надо потом переправить
JMP start

extrn _main : near ; Эта процедура ноходиться в Си.
;public SUM
;public KEY

;COM equ 03F8h ;для WINDOWS
;COM equ 040h ;для UNIX
;REJIM db 0 ;2-FD, 3-BIOS, 4-BOOT
;KEY db 32 dup (0)
;SUM db 4 dup (055h)

start PROC NEAR

call _main ; вызываем коод программы
ret ; возвращаем управление в биос

start endp ; конец процедуры
ends CODESG ; конец сегмента
end mybegin ; конец программы[/codebox]
Код С-программы:
[codebox]// считывает байт из порта и возвращает его
{
unsigned char mych;
asm
{
mov ax,040h
mov es,ax
mov dx,es:[000h]


add dx,3
mov al,080h
out dx,al


sub dx,3
mov al,1
out dx,al


add dx,3
mov al,3
out dx,al


sub dx,2
mov al,3
out dx,al

mov dx,es:[000h]
add dx,5
t1:
in al,dx
test al,01h
jz t1
sub dx,5
in al,dx
mov mych,al
}
return mych;
}

void comout(unsigned char outkod)
// пишет байт outch в порт
{
asm
{
mov ax,040h
mov es,ax
mov dx,es:[000h]


add dx,3
mov al,080h
out dx,al


sub dx,3
mov al,1
out dx,al


add dx,3
mov al,3
out dx,al


sub dx,2
mov al,3
out dx,al

mov ah,41h
mov dx,es:[000h]
add dx,5

m1:
in al,dx
test al,040h
jz m1
mov dx,es:[000h]
mov al,outkod
out dx,al
}
return;
}

void mysendflash(unsigned long fd)
//отсылает команду 0х12, затем ждет квитанцию на нее.
//если пришла квитанция 0х31 шлем 4 байта имитозащиты
//начиная с младшего, при этом на каждый байт считывает
//квитанцию. Если вместо квитанции пришла команда 0х33
//шлет байты имитозащиты заново.
{
unsigned long fd_ch_sum=0L;
fd_ch_sum = fd;
unsigned char ret=0x0;
comout(0x12);
ret=comin();
if (ret==0x31)
while (ret!=0x0)
{
unsigned char *c;
c=(unsigned char*)&fd;
comout(*c);
ret=comin();
if (ret==0x31) {c++;comout(*c);ret=comin();}
if (ret==0x31) {c++;comout(*c);ret=comin();}
if (ret==0x31) {c++;comout(*c);ret=comin();}
if (ret==0x31) ret=0x0;
}
return;
}

void givekey(char *hkey)
//принимает 32 байта ключа.
//считывает байты ключа, и на каждый
//передает квитанцию. Если будет передан байт
//0х33 начинает принимать ключ заново с первого байта.
{
int sch=0;
while (sch<32)
{
hkey[sch]=0x0;
hkey[sch]=comin();
comout(0x31);
sch++;
if (hkey[sch-1]==0x33) sch=0;
}
return;
}

void main(void)
{
unsigned long flash_ctrl_sum=0L;

//режим
int myreg=0;

char Key[32];

//comin(); // считывает байт из порта и возвращает его
//comout(outch); // пишет байт outch в порт

unsigned char inch=0x00;

//передаем команду готовности пока не примем квитанцию о принятии
while (inch!=0x31)
{
comout(0x11); // передаем команду готовности
inch=comin(); // ждем квитанцию
}

//бесконечный цикл
while (1==1)
{
inch=comin();

if (inch==0x22) //приняли команду "Имитозащита FD"
{myreg=1;comout(0x31);} //устанавливаем 1 режим и шлем квитанцию на команду

if (inch==0x23) //приняли команду "Имитозащита BIOS"
{myreg=2;comout(0x31);} //устанавливаем 2 режим и шлем квитанцию на команду

if (inch==0x24) //приняли команду "Имитозащита BOOT"
{myreg=3;comout(0x31);} //устанавливаем 3 режим и шлем квитанцию на команду

if (inch==0x21) // приняли команду "Ключ"
{
comout(0x31); //передаем квитанцию на команду 0х21
givekey(Key); //принимаем 32 байта ключа

Gost(Key);

if (myreg==1)
{
getmemflash(0x0L,0x1FFFFFFL);
flash_ctrl_sum=GIZ(1);
//отсылаем
mysendflash(flash_ctrl_sum);
myreg=0;
}
}

}// while (1==1)
return ;
}// void main(void)[/codebox]

С ком-порта считываю другим компом. При передаче команда из данной программы (типа comout(0x31);) все нормально иногда, иногда приходит хз что, типа 0ССh. А если после заполнения массива Key я пытаюсь посмотреть что получилось, вставляя код:
Код:
for (int i=0; i<32; i++)
comout(Key[i]);
то на другой стороне получаю нули, и в них еще парочку байт 0С0h. Где и что я сделал не так?
На всякий случай - среда BC4.5
 

unreal2004

New member
28.02.2010
1
0
#2
Если это приложение работате под Windows - к портам нельзя обращаться напрямую ( типа out XX,YY). Необходимо юзать виндовские ф-ции.Или я что то не так понял :)
Нужно работать через CreateFile и прочие ф-ции относящиеся к последовательным портам.