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

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем ShlakBaum, 1 фев 2010.

  1. ShlakBaum

    ShlakBaum Гость

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

    unreal2004 New Member

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

Поделиться этой страницей