В свое время делал обмен по Modbus с CPU188, так что постараюсь ответить на ваши вопросы.
1. На J7 нужно объединить контакты +TxD1 c +RxD1, а -TxD1 c -RxD1, и подключать их к Data+ и Data- соответственно.
2. Положение всех перемычек, влияющих на связь, вы вроде указали правильно.
3. Все отличия при обмене по 485 связаны в основном с тем, что обмен в этом режиме - симплексный, то есть прием и передача одновременно выполняться не могут. Более того, все, что идет на передатчик, автоматически принимается своим приемником, и это тоже нужно учитывать. У меня было сделано так, что при необходимости передачи сначала делается включение передатчика (об этом ниже), затем делается задержка на коммутацию (около 75 мкс), затем выполняется собственно передача. В конце передачи выполнялось ожидание до окончания передачи последнего символа (проверялись соответствующие регистры порта), затем делалась задержка на передачу последнего бита (зависит от скорости - для 115200 это 10 мкс), а затем передатчик выключался. В принципе если нет жестких требований по времени достаточно видимо просто сделать задержки порядка 1 мс после включения и перед выключением передатчика.
4. Коммутация передачи/приема RS485, естественно, необходима. Я использовал регистр FF7Ah, хотя и через BIOS, наверное, тоже будет работать. Использовался следующий фрагмент кода:
// базовые номера COM-портов
#define BA_COM1 0xFF80 // COM1
#define BA_COM2 0xFF10 // COM2
#define BA_PIO 0xFF7A // PIO
// биты управления RTS для COM-портов
#define RTS_COM1 0x0010 // COM1
#define RTS_COM2 0x0008 // COM2
// макросы для работы с портами CPU188
#define IN188(port) inpw(port)
#define OUT188(port,val) \
_AX=port; \
asm push ax; \
_AX=val; \
asm pop dx; \
asm out dx,al;
// управление передатчиком RS-485
void TModbus188::RS485Control(TMode mode)
{
WORD x=NCom? RTS_COM2 : RTS_COM1;
if (mode==M_SEND) {
OUT188(BA_PIO,IN188(BA_PIO) & ~x);
}
else {
OUT188(BA_PIO,IN188(BA_PIO) | x);
}
}
Попробуйте, должно заработать. Если будут еще какие-то вопросы, постараюсь ответить. Удачи!