A bus error and a segmentation violation each result from a program accessing memory it shouldn't, but they are detected and signaled by different mechanisms.
The details do vary with operating system. The following observations are, more or less, how things happen with a unix host.
If the OS detects a process accessing memory that the OS hasn't allocated to that process (e.g. allocated to another process), it sends a SIGSEGV signal to the offending process. The process/program then terminates, reporting a segmentation violation.
However, if the hardware detects an access of hardware resources that don't physically exist, it raises a hardware fault that is trapped by the OS, which sends a SIGBUS signal to the process executing the offending instruction. This can also happen with unaligned memory accesses - a hardware fault is raised, trapped by the operating system which sends a signal to the originating process.
Although the details vary (e.g. how the OS or kernel responds to hardware faults, or what signals it sends to an offending process) the general ideas are similar.